“调用”在 javascript 中是如何工作的?

IT技术 javascript call
2021-03-21 06:20:21

我有一个关于 javascript 中“调用”的问题。

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 变量是否将其属性和成员复制(或指向?)到人类变量的原型?

2个回答

Yehuda Katz 有一篇关于 JavaScriptFunction#call方法的好文章。他的文章应该回答你的问题,此外还有许多后续问题。

直接调用函数时,使用一般语法:

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"`
很好的解释
2021-05-20 06:20:21

.call()设置this值,然后使用传递给的参数调用函数.call().call()当您想this在被调用函数中设置值而不是让它设置为 javascript 通常设置的任何值时,您可以使用而不是直接调用该函数

.apply()是姐妹函数。它还可以设置this值,并且可以在数组中接受参数,因此当您尝试从其他函数调用传递变量参数列表或以编程方式构建可能具有不同数量的参数列表时,可以使用它论据视情况而定。