【问题标题】:Assign function.call to a variable将 function.call 分配给变量
【发布时间】:2017-12-29 14:28:42
【问题描述】:

我有这个代码

var a = function(){}
var b = a.call
b() // TypeError: b is not a function

typeof b'function'console.log(b) 显示 ƒ call() { [native code] }

有人可以解释一下这种行为吗?

【问题讨论】:

  • 您为什么要这样做?看起来很奇怪。
  • @Andy:OP 可能认为a 会自动绑定到.call。如果正确完成,这种绑定函数有合法用途。就像您预期收到一个应该是 a 参数的项目数组一样,但第一个数组项目实际上是它的 this 值。因此,如果您将a 绑定到call 并存储它,您就可以像boundA.apply(null, args) 一样调用它,或者在现代环境中,boundA(...args)
  • 即使用它的原因是能够为a切换上下文
  • @epascarello 因为我不想到处写Object.prototype.hasOwnProperty.call

标签: javascript function call first-class-functions


【解决方案1】:

它不起作用的原因是.call() 要求一个函数在调用时是this 的值,但是你已经将它与a 分离,所以那里没有更多的关系。

所以因为b,也就是Function.prototype.call,没有为this arg 提供函数,它没有有效的函数可以调用,所以它给出了错误。

如果你这样做了,它会起作用的:

var b = a.call.bind(a);

这是因为现在a 函数被绑定为.call()this 值。

另一种方法是使用.call 调用.call

var b = a.call;
b.call(a);

现在您将a 函数设置为bthis 值(这又是Function.prototype.call 方法),但您是在调用时进行的。

【讨论】:

  • 奇怪的是,当typeof b === "function" 时,b 的 TypeError 不是函数。
  • @JaredSmith:该消息引用了b 中的this 值,因为它需要一个函数。所以现在它得到undefined 作为this 值,所以它基本上是在尝试在内部调用undefined()
  • 我不这么认为。如果有人这样做var a = function(){};var b = a.call;b(function(){});,它仍然会失败。如果你做b(a),它甚至会失败。
  • @JaredSmith:那是因为您将函数作为常规参数传递给 Function.prototype.call,而不是作为其 this 值。将其更改为b.call(function(){})
  • ...请记住,当您执行 a.call("foo") 时,a 函数会自动设置为 .call()this 值,但是当您执行 var b = a.call 时,要设置this 的值是.call,你需要手动完成,因为无法再实现通过属性成员语法设置this 的神奇行为。
猜你喜欢
  • 2014-05-11
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多