如果我有一个记录"称为我的功能"
的功能
function myFunction() {
console.log('called my function')
}
Function.prototype.call.call(myFunction) // => "called my function"

在单个call
期间:
function myFunction() {
console.log('called my function')
}
Function.prototype.call(myFunction)

答案 0 :(得分:2)
当您撰写someFunction.call(foo)
时,表示在将someFunction
作为foo
参数传递时调用this
。通常情况下,您有someObject.someFunction()
,someObject
隐式this
,但.call
可以将this
设置为您想要的任何内容。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call。
那么Function.prototype.call(myFunction)
做了什么?好吧,它调用Function.prototype
,将myFunction
作为this
传递。调用Function.prototype
做什么?根据ECMA规范:
Function原型对象本身就是一个Function对象(它的[[Class]]是
"Function"
),在调用时,接受任何参数并返回undefined
。
这就是Function.prototype.call(myFunction)
没有明显效果的原因。
另一方面,Function.prototype.call.call(myFunction)
调用Function.prototype.call
(这本身就是一个函数!),将myFunction
作为this
传递。这是做什么的?与myFunction.call()
完全相同:当您查找函数对象的call
属性时,无论如何都可以从Function.prototype
获取它(通过对象继承)。那这是做什么的呢?它调用myFunction
没有(正常)参数,但它看到的this
值有点棘手:如果函数处于严格模式,this
将是undefined
;如果它是非严格的,this
将是全局对象(浏览器中的a.k.a. window
)。
这也是从myFunction()
获得的相同行为(即不在对象上调用它)。换句话说,Function.prototype.call.call(foo)
只是一种(非常)迂回的写作方式foo()
。
答案 1 :(得分:0)
简而言之,call
本身并不期望函数作为参数,也不会将其作为函数调用它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
相反,call
是其Function
中定义的所有prototype
个对象的成员函数,它使您能够在传递要用作{的参数时调用成员函数的特定实现。 {1}}在函数调用中。由于this
本身是call
,因此它也具有Function
call
函数。
这种情况的一个用例是模仿member
概念。 Java的。考虑使用super
以外的函数的另一个示例:
call

答案 2 :(得分:-1)
call
是一个属于Function
对象的函数,您可能知道。
所以如果我们有这个功能:(注意这个)
function invite(where) {
alert ("hi "+this.name+" do you want come to "+where);
}
和这个对象:
var obj = { name:"PETER" }
我们可以做到
invite.call(obj, "the cinema")
要调用的第一个参数是CONTEXT。该功能将在该对象的上下文中执行,这就是警报显示的原因" PETER" for this.name
第二个参数等是参数,这就是警报显示的原因"电影"。
Function.prototype.call
是原始"电话"功能对象的功能。所以你直接访问这个函数,并想为你的对象调用它("调用函数调用"):
Function.prototype.call.call
你想要的功能" call"在函数myFunction(第一个调用参数)的上下文中调用:
Function.prototype.call.call(myFunction, ...);
实际上,相当于
nyFunction.call(...);
第一种情况无效,因为原型本身就是一种功能(你可以" .call" :),所以
Function.prototype.call(whatever)
只相当于
Function.prototype();
在你的函数上下文中执行