这里,如果我有一个记录为“我的函数”的函数
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)
发布于 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()的一种(非常)迂回的方式。
发布于 2017-04-30 16:44:38
简而言之,call本身并不期望函数作为参数,也不会以函数的形式调用它的参数:Objects/Function/call
相反,call是在其prototype中定义的所有Function对象的成员函数,它使您能够在传递要用作函数调用中的this的参数时调用成员函数的特定实现。因为call本身是一个Function,所以它也有一个call member函数。
这方面的一个用例是模拟例如Java中的super概念。考虑另一个使用call以外的函数的例子
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();
发布于 2017-04-30 16:40:58
一个小小的背景:
call是属于Function对象的函数,您可能知道。
因此,如果我们有这个函数:(请注意这个)
function invite(where) {
alert ("hi "+this.name+" do you want come to "+where);
}这个物体:
var obj = { name:"PETER" }我们可以
invite.call(obj, "the cinema")第二个案例: Function.prototype.call.call
Function.prototype.call是函数对象的原始“调用”函数。因此,您将直接访问该函数,并希望为您的对象调用它(“调用函数调用”):
Function.prototype.call.call您希望在函数myFunction (第一个调用参数)的上下文中调用函数" call“:
Function.prototype.call.call(myFunction, ...);这实际上相当于
nyFunction.call(...);第一例
第一个例子什么也不做,因为prototype本身就是一个函数(您可以".call“:),所以
Function.prototype.call(whatever)就等于
Function.prototype();在函数的上下文中执行
https://stackoverflow.com/questions/43708620
复制相似问题