这经常可以看到使用以下定义成语模块CommonJS的时():fn.call(本)与FN限定CommonJS的模块
(function() {
var logThis = function() { console.log(this); }
module.exports = logThis;
}).call(this);
Underscore.js,例如,执行此操作。
我只花了半个小时与一位同事讨论他们为什么要用call(this)
来调用关闭。这将导致闭包内的this
的值从调用者继承,而不是被设置为全局对象。然而,当我在Node.js的测试这一点,this
模块内部的pH值总是全局对象,甚至当我加载并运行它像这样:
var bar = {};
bar.foo = function() { var foo = require("./foo"); foo(); }
我真的很期待看到bar
对象在控制台中,但实际上我看到了全局对象。然后,我想这可能是因为像Underscore.js这样的模块也被用在web上下文中。但在这种情况下,它将加载<脚本>标记,因此this
总是等于全局对象。
什么给?我确信有一个使用这个构造的理由,但是在这个特殊情况下我看不出这个模块是在Node.js中还是在网页中使用。
更新:只是为了澄清,我能想到的一些情况下,这可能有所作为的。例如,如果我说:
var bar = {}
var foo = require("./foo");
bar.foo = foo;
bar.foo();
(感谢@Pointy纠正我原来的例子)
我希望模块在封闭进行评估时require()
被调用,这意味着值this
内部将被绑定到全局对象,该对象将被写入控制台,即使foo()
然后被调用为“bar”对象的成员。然而,即使在这个例子中,我也看到了控制台中的“bar”对象。我猜想this
没有像我期望的那样被绑定到闭包?
概括地说,我正在寻找一个例子像Underscore.js一个模块都会有不同的行为,由于被包裹在与fn.call(this)
,而不只是fn()
调用的关闭,无论是在Node.js的或网络页。
确定我会更新我的答案... – Pointy 2012-08-01 17:16:29