JavaScript自我执行功能 - 有什么区别?

mod*_*bie 7 javascript jquery backbone.js

我非常熟悉使用jQuery自行执行函数.

(function($) { /* do stuff */ })(jQuery);
Run Code Online (Sandbox Code Playgroud)

今天我正在阅读backbone.js源代码并注意到他们这样做:

(function() { /* do stuff */ }).call(this);
Run Code Online (Sandbox Code Playgroud)

这实现了同样的事情吗?以下两行代码会做同样的事情吗?

(function($) { /* do stuff */ })(jQuery);
(function($) { /* do stuff */ }).call(jQuery);
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 12

第一种形式是传入参数,而第二种形式是设置执行函数内部的"this".它们是不同的.

(function(x){ console.log(this,x); })( jQuery );
//--> [window object]
//--> [jQuery object]

(function(x){ console.log(this,x); }).call( jQuery );
//--> [jQuery object]
//--> undefined

(function(x){ console.log(this,x); }).call( jQuery, jQuery );
//--> [jQuery object]
//--> [jQuery object]
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Function.prototype.callFunction.prototype.apply.

这是您可能想要使用该call技术的情况:

v = 'oh noes!'
var o = {
  v : 42,
  f : function(){
    console.log(this.v);
    (function(){ console.log(this.v) })();
  }
};
o.f();
// --> 42
// --> 'oh noes!'
Run Code Online (Sandbox Code Playgroud)

如果不设置thisvia 的值,call()则在Global(窗口)的范围内调用自调用函数,而不是当前对象.