Javascript 为什么用.call(this)代替括号
我经常遇到的问题有什么特别的原因吗:Javascript 为什么用.call(this)代替括号,javascript,Javascript,我经常遇到的问题有什么特别的原因吗: (function() { console.log("Hello"); }).call(this); 而不是: (function() { console.log("Hello"); })(); 它在传递此以调用或不调用时应具有相同的效果 似乎存在一些性能差异:.可能该函数中的代码使用了此(您只有控制台.log)。在具有调用的版本中,函数内的此与函数外的此相同。如果没有调用,函数中的该要么是全局对象(松散模式),要么是未定义的(严格模式) 如果你
(function() {
console.log("Hello");
}).call(this);
而不是:
(function() {
console.log("Hello");
})();
它在传递此
以调用或不调用时应具有相同的效果
似乎存在一些性能差异:.可能该函数中的代码使用了
此
(您只有控制台.log
)。在具有调用
的版本中,函数内的此
与函数外的此
相同。如果没有调用
,函数中的该
要么是全局对象(松散模式),要么是未定义的
(严格模式)
如果你没有在函数中使用
这个
,就没有理由使用调用
版本,我倾向于不这样做,因为这会增加不必要的复杂性(而且显然是非常小的性能成本)。添加调用(这个)
很重要,它改变了功能外壳的上下文,这意味着this
关键字将引用与外部功能外壳相同的this
在您的特定代码中,它没有任何区别,因为在您的函数中,您根本没有引用此
this.a = 123;
(function() {
console.log(this.a); // always 123 regardless of scope
}).call(this);
假设
此
引用的不是窗口对象,则这一点非常重要。如果this
已经指向窗口,那么添加.call(this)
没有任何区别,因为没有它,默认情况下this
将进入窗口。因此它们在松散模式下的行为相同,但在严格模式下则不同?@NickRussler:只有当该代码处于全局范围时(或者用this
作为全局对象调用)。我假设它不是,而是在this
不是全局对象的代码中(DOM事件处理程序等)@Nick-不,假设你生活之外的代码将this
设置为全局对象以外的其他对象啊,当然,现在我知道了。谢谢你们。AFAIK CoffeeScript将文件编译成一个异常函数,并通过调用执行,这让我想知道..性能成本的来源?只是想看看是否真的有性能性能成本,或者这只是猜测。