首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么call.call调用函数

为什么call.call调用函数
EN

Stack Overflow用户
提问于 2017-04-30 16:26:27
回答 3查看 93关注 0票数 2

这里,如果我有一个记录为“我的函数”的函数

代码语言:javascript
复制
function myFunction() {
  console.log('called my function')
}

Function.prototype.call.call(myFunction) // => "called my function"

而在单个call期间,如:

代码语言:javascript
复制
function myFunction() {
  console.log('called my function')
}
Function.prototype.call(myFunction)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-30 16:51:13

编写someFunction.call(foo)时,它意味着调用someFunction,同时将foo作为this参数传递。通常您有someObject.someFunction(),它隐式地将someObject传递为this,但是使用.call,您可以将this设置为您想要的任何东西。见Objects/Function/call

那么Function.prototype.call(myFunction)是做什么的呢?它调用Function.prototype,将myFunction传递为this。调用Function.prototype是做什么的?根据ECMA规范:

函数原型对象本身就是一个函数对象(它的[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()的一种(非常)迂回的方式。

票数 2
EN

Stack Overflow用户

发布于 2017-04-30 16:44:38

简而言之,call本身并不期望函数作为参数,也不会以函数的形式调用它的参数:Objects/Function/call

相反,call是在其prototype中定义的所有Function对象的成员函数,它使您能够在传递要用作函数调用中的this的参数时调用成员函数的特定实现。因为call本身是一个Function,所以它也有一个call member函数。

这方面的一个用例是模拟例如Java中的super概念。考虑另一个使用call以外的函数的例子

代码语言:javascript
复制
function Foo() {
  console.log('Foo');
}

Foo.prototype.bar = function () {
    console.log('Foo bar');
};

function Baz() {
    console.log('Baz');
}

Baz.prototype = Object.create(Foo.prototype);

Baz.prototype.bar = function () {
    Foo.prototype.bar.call(this);
        // Call the super class implementation of `bar`
    console.log('Baz bar');
};

var baz = new Baz();
baz.bar();

票数 0
EN

Stack Overflow用户

发布于 2017-04-30 16:40:58

一个小小的背景:

call是属于Function对象的函数,您可能知道。

因此,如果我们有这个函数:(请注意这个)

代码语言:javascript
复制
function invite(where) {
   alert ("hi "+this.name+" do you want come to "+where);
}

这个物体:

代码语言:javascript
复制
var obj = { name:"PETER" }

我们可以

代码语言:javascript
复制
invite.call(obj, "the cinema")
  • 要调用的第一个参数是上下文。该函数将在该对象的上下文中执行,这就是为什么警报将显示this.name的"PETER“
  • 第二个参数等等是参数,这就是为什么警报将显示“电影院”。

第二个案例: Function.prototype.call.call

Function.prototype.call是函数对象的原始“调用”函数。因此,您将直接访问该函数,并希望为您的对象调用它(“调用函数调用”):

代码语言:javascript
复制
 Function.prototype.call.call

您希望在函数myFunction (第一个调用参数)的上下文中调用函数" call“:

代码语言:javascript
复制
 Function.prototype.call.call(myFunction, ...);

这实际上相当于

代码语言:javascript
复制
 nyFunction.call(...);

第一例

第一个例子什么也不做,因为prototype本身就是一个函数(您可以".call“:),所以

代码语言:javascript
复制
Function.prototype.call(whatever)

就等于

代码语言:javascript
复制
Function.prototype();

在函数的上下文中执行

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43708620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档