直接调用函数和使用apply之间的Javascript差异

直接调用函数和使用apply之间的Javascript差异,javascript,Javascript,两者都在相同的上下文中调用相同的函数,那么这些语句之间的区别是什么呢 this.subject.hello(); apply()用于在不同上下文中调用该方法。但在这里,它是在相同的上下文中调用的 this.subject.hello.apply(this.subject, arguments) 第一个调用它时没有参数。第二个函数使用当前函数的参数调用它 this.subject = { hello: function() { console.log("Hello called w

两者都在相同的上下文中调用相同的函数,那么这些语句之间的区别是什么呢

this.subject.hello();
apply()用于在不同上下文中调用该方法。但在这里,它是在相同的上下文中调用的

this.subject.hello.apply(this.subject, arguments)

第一个调用它时没有参数。第二个函数使用当前函数的参数调用它

this.subject = {
  hello: function() {
    console.log("Hello called with arguments " + JSON.stringify(arguments));
  }
};

function callHello() {
  console.log("this.subject.hello();");
  this.subject.hello();
  console.log("this.subject.hello.apply(this.subject, arguments);");
  this.subject.hello.apply(this.subject, arguments);
}

callHello(1, 2);
// => this.subject.hello();
//    Hello called with arguments {}
//    this.subject.hello.apply(this.subject, arguments);
//    Hello called with arguments {"0":1,"1":2}

唯一的区别是,在第一次调用中,您没有传递任何参数。

使用
apply
我们可以更改方法的上下文,通常它采用当前对象的上下文。当第一个参数是apply方法时传递上下文,其他参数在数组中传递,数组是apply方法中的第二个参数

有关
call
apply
之间的其他查询,您可以参考

唯一的区别是,一个有
参数,另一个没有。

以下是关于
应用
调用
和JavaScript上下文的一些很好的答案:


我还可以在第一个参数中传递参数。通常,当您不知道将有多少个参数时,您将使用
apply
调用函数/方法。一个常见的例子是以破坏性方式连接一个数组:
concat
返回一个新数组,但是如果您想通过修改现有数组来连接,您可以使用
push
array.push(3,4)
。但是如果有两个数组,就不能使用
array.push(other)
;说
array.push(其他[0],其他[1])
是愚蠢的,因为你需要知道它永远不会有超过2个成员,你不能使用
array.push(*other)
的Ruby splat技巧;因此,您需要应用
apply
array.push.apply(array,other)
apply不会更改“上下文”,它用于将函数的this值设置为特定值。“通常它采用当前对象的上下文”。不。函数的这是由调用设置的,它与当前(执行)上下文无关。许多函数都是在没有设置的情况下调用的,因此它默认为全局对象,或者在严格模式下是未定义的。