我在javascript中有一个关于'call'的问题。
var humanWithHand = function(){
this.raiseHand = function(){
alert("raise hand");
}
}
var humanWithFoot = function(){
this.raiseFoot = function(){
alert("raise foot");
}
}
var human = function(){
humanWithHand.call( this );
humanWithFoot.call( this );
}
var test = new human();
所以..当我使用'call'作为humanWithHand.call(this)时,内部会发生什么?
humanWithHand将变量(或点?)的属性和成员复制到人类变量的原型中吗?
答案 0 :(得分:9)
Yehuda Katz拥有JavaScript Function#call
方法a good writeup。他的写作应该回答你的问题,以及许多后续问题。
使用一般语法直接调用函数时:
var foo = function() {
console.log("foo");
return this;
};
foo(); // evaluates to `window`
然后函数调用中的this
是函数调用之外的this
。默认情况下,在浏览器中,任何函数调用之外的this
都是window
。因此,在上面的函数调用中,this
默认情况下也是window
。
使用方法调用语法调用函数时:
var bar = {
foo: function() {
console.log("foo");
return this;
}
};
bar.foo(); // evaluates to `bar`
然后函数调用中的this
是最右边句子左边的对象:在这种情况下,bar
。
我们可以使用call
来模拟这种情况。
当您在对象外部设置一个函数并希望在设置为对象的函数调用中使用this
调用它时,您可以:
var foo = function() {
console.log("foo");
return this;
}
var bar = { };
foo.call(bar); // evaluates to `bar`
您也可以使用此技术传递参数:
var foo = function(arg1, arg2) {
console.log("foo");
return arg1 + arg2;
}
var bar = { };
foo.call(bar, "abc", "xyz"); // evaluates to `"abcxyz"`
答案 1 :(得分:8)
.call()
设置this
值,然后使用传递给.call()
的参数调用该函数。当你想在被调用函数中设置.call()
值而不是将它设置为javascript通常设置的值时,你可以使用this
而不是直接调用函数。
.apply()
是姐妹职能。它还可以设置this
值,它可以在数组中使用参数,因此当您尝试从其他函数调用传递变量参数列表或者以编程方式构造参数列表时,可以使用它根据具体情况,可能会有不同数量的论点。