我想确定,http://eloquentjavascript.net/10_modules.html,例如:
(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")));
// → weekDay not defined
当我在提到的网站上运行它时,它可以工作,但是当我尝试在vs代码(+ node.js to debug)中执行相同操作时,它表示weekDay
未定义。我已经弄清楚了,原因是这个关键字没有引用包含整个代码的对象,但是它指的是持有调用该函数的对象的对象,所以我试过这个:
它有效,任何人都可以解释为什么? IMO传递的参数不被视为函数变量,而是属于调用函数的对象的变量(但是为什么书中的代码可以在网站上运行呢?)。
(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); }; })(weekDay = {}); console.log(weekDay.name(weekDay.number("Saturday"))); // → Saturday
(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); }; })(weekDay = {}); console.log(weekDay.name(weekDay.number("Saturday"))); // → Saturday
答案 0 :(得分:1)
首先,不要对不理解this
感到不舒服。这令人困惑。
这总结this
非常好:
道德感谢凯尔。
我的TL; DR:您在节点中调用的this
绑定到文件中运行的代码。您在浏览器中调用的this
绑定到window
对象,该对象是浏览器中可用的特殊对象,超级用户从过去的岁月中遗留下来。 ;)
记住this
是一个绑定,在调用函数时产生,它引用的内容完全取决于调用函数的调用站点。
在示例沙箱中(从浏览器的全局范围调用),this
引用浏览器的window
对象。 window
是浏览器的全局对象。它包含所有全局变量。您的呼叫站点是全球范围。
用最简单的术语来说,每个节点文件都在自己的泡泡中运行。每个文件都有自己的this
,呼叫网站就是泡泡。全局范围中的变量不会自动挂在节点模块中的this
下。
再插一下:阅读凯尔的书。去上课吧。他是一位了不起的老师。