Bri*_*uch 4 javascript v8 node.js
以下功能从Ch.逐字复制.10个Eloquent Javascript,它与v8解释器完美搭配.然而,它在Node中爆炸,对象weekDay未定义.它在本书提供的沙箱解释器中运行良好.有人可以解释一下是什么?
(function(exports) {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
exports.name = function(number) {
return names[number];
};
exports.number = function(name) {
return names.indexOf(name);
};
})(this.weekDay = {});
console.log(weekDay.name(weekDay.number("Saturday")));
Run Code Online (Sandbox Code Playgroud)
小智 5
这是因为this在Node模块中没有指向全局对象.它指向exports该模块.这意味着weekDay不能作为全局变量使用.
// ---------v
console.log(exports.weekDay.name(weekDay.number("Saturday")));
Run Code Online (Sandbox Code Playgroud)
要么
// ---------v
console.log(this.weekDay.name(weekDay.number("Saturday")));
Run Code Online (Sandbox Code Playgroud)
为了获得节点模块外观的广泛(和简化)视图,它基本上将您的代码放入IIFE中.
所以如果这是你的模块......
this.foo = "bar"
console.log(exports.foo); // "bar"
Run Code Online (Sandbox Code Playgroud)
它有效,因为它实际上是这样的......
var exports = {}; // Generated by Node
(function(exports) { // Generated by Node
this.foo = "bar"
console.log(exports.foo); // "bar"
}).call(exports, exports); // Generated by Node
Run Code Online (Sandbox Code Playgroud)
其中额外的代码行由Node生成.您可以看到它创建了一个对象,它将其用作IIFE函数的this值和exports参数.
还有一些他们传递给IIFE,但这显示了基本的想法.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |