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.call和Function.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(窗口)的范围内调用自调用函数,而不是当前对象.