我经常遇到一个特殊原因:
(function() {
console.log("Hello");
}).call(this);
而不是:
(function() {
console.log("Hello");
})();
将this
传递给来电时,它应该具有相同的效果吗?
似乎存在一些性能差异:http://jsperf.com/call-vs-parenthesis。
答案 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
将转到该窗口。