为什么call.call调用函数

时间:2017-04-30 16:26:27

标签: javascript call

如果我有一个记录"称为我的功能"

的功能



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)




3 个答案:

答案 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.call

Function.prototype.call是原始"电话"功能对象的功能。所以你直接访问这个函数,并想为你的对象调用它("调用函数调用"):

 Function.prototype.call.call

你想要的功能" call"在函数myFunction(第一个调用参数)的上下文中调用:

 Function.prototype.call.call(myFunction, ...);

实际上,相当于

 nyFunction.call(...);

第一种情况

第一种情况无效,因为原型本身就是一种功能(你可以" .call" :),所以

Function.prototype.call(whatever)

只相当于

Function.prototype();

在你的函数上下文中执行