Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么用.call(this)代替括号_Javascript - Fatal编程技术网

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将文件编译成一个异常函数,并通过调用执行,这让我想知道..性能成本的来源?只是想看看是否真的有性能性能成本,或者这只是猜测。