为什么.call(this)使用而不是括号

时间:2013-12-10 18:44:05

标签: javascript

我经常遇到一个特殊原因:

(function() {
  console.log("Hello");
}).call(this);

而不是:

(function() {
  console.log("Hello");
})();

this传递给来电时,它应该具有相同的效果吗?

似乎存在一些性能差异:http://jsperf.com/call-vs-parenthesis

2 个答案:

答案 0 :(得分:7)

据推测,该函数中的代码使用this(您只有console.log)。在call的版本中,中的this 该函数与其外的this相同。如果没有call,函数内部的this可以是全局对象(松散模式)或undefined(严格模式)。

如果您未在函数中使用this,则没有理由执行call版本,我倾向于不这样做,因为这是额外的不必要的复杂性(显然是<强>非常小性能成本)。

答案 1 :(得分:3)

添加.call(this)很重要,它会更改功能机箱的上下文,这意味着this关键字将引用与外部功能机箱相同的this

在您的特定代码中,它没有任何区别,因为在您的函数内部,您根本没有引用this

this.a = 123;
(function() {
   console.log(this.a); // always 123 regardless of scope
}).call(this);

这很重要,假设this指的是窗口对象以外的东西。如果this已经指向该窗口,则添加.call(this)没有任何区别,因为没有它,默认情况下this将转到该窗口。