【发布时间】:2017-04-15 08:57:35
【问题描述】:
我在stackoverflow上查了很多类似的问题,比如call.call 1,call.call 2,但我是新手,不能在任何地方发表评论。我希望我能找到关于 JavaScript 解释器如何执行这些函数的全面而透彻的解释,并在这里提出一个新问题。
这里有一些例子:
function my(p) { console.log(p) }
Function.prototype.call.call(my, this, "Hello"); // output 'Hello'
上面的例子是Function.prototype.call的标准用法,比较容易理解。我的理解是:“我的”作为函数对象执行其继承的方法“Function.prototype.call”,即。 my.(Function.prototype.call) => my.call(this, 'Hello')
Function.call.call(my, this, "Hello") // output 'Hello'
与上面的示例相比,我在这里感到困惑。我不知道 JavaScript 解释器是如何工作的。 'my' 将 Function.call 和 Function.prototype.call 视为相同的方法?
Function.prototype.call(my, this, 'Hello2') // output nothing
Function.call(my, 'Hello2') // output nothing
我无法解释为什么这个语句没有抛出错误?其实我不知道 Function.prototype.call 作为方法是怎么工作的。
Function.prototype.call.call.call(my, this, "Hello3"); // output 'Hello3'
我无法解释 JavaScript 解释器如何解释上述语句?从右到左解释“呼叫”?那么 my.(Function.prototype.call.call) 是什么意思呢?
Function.prototype.call.call.call.call(my, this, "Hello4"); // output 'Hello4'
为什么我可以在这里放任意数量的'.call',并且输出是一样的?不是每个调用都使用一个参数作为“this”对象,这应该意味着只有三个参数是不够的吗?与上一个类似的问题
然后是更多例子:
var $ = Function.prototype.call
$(my, this, 'Hello5') // Exception: TypeError: Function.prototype.call called on incompatible Proxy
为什么它不输出任何内容,就像上面的一个例子一样?
var v = Function.prototype.call.call
v(my, this, 'Hello6') // Exception: TypeError: Function.prototype.call called on incompatible Proxy
这是否意味着,当使用变量 v 时,JavaScript 解释器会尝试单独解释 v,而没有看到后面有参数?然后解释器认为'this'是全局变量'window'?我不知道解释器在 v() 和 Function.prototype.call.call() 之间的工作方式有何不同
有人可以帮忙吗?谢谢!
【问题讨论】:
-
Function.prototype.call.call === Function.prototype.call // trueFunction.call === Function.prototype.call.call // true -
谢谢。是的,它们是严格相等的,但是你能解释一下为什么当它们后面跟着括号中的相同参数时它们的输出会不同吗?
-
我的回答中没有做到吗?
标签: javascript functional-programming prototype call