我想确定,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 进行调试)中执行相同操作时,它说 weekDay
未定义。我已经弄清楚这是因为 this 关键字不是指包含整个代码的对象,而是指包含调用函数的对象的对象,所以我试过这个:
它有效,谁能解释为什么? IMO 传递的参数不被视为函数变量,而是属于调用该函数的对象的变量(但是为什么书中的代码那时可以在网站上运行?)。<p></p> <pre><code>(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 </code></pre>
最佳答案
首先,不要因为不理解这个
而难过。这令人困惑。
这很好地总结了 this
:
支持 Kyle 老师。
我的 TL;DR:您在节点中调用的 this
绑定(bind)到文件中运行的代码。您在浏览器中调用的 this
绑定(bind)到 window
对象,该对象是浏览器中可用的特殊对象,具有过去时代遗留下来的超能力。 ;)
记住 this
是一个绑定(bind),在调用函数时创建,它引用的内容完全取决于调用函数的调用点。
在示例沙箱(从浏览器的全局范围调用)中,this
指的是浏览器的window
对象。 window
是浏览器的全局对象。它包含所有全局变量。您的调用站点是全局范围。
用最简单的话来说,每个节点文件都在自己的气泡中运行。每个文件都有自己的 this
调用点是气泡。您在全局范围内的变量不会自动卡在节点模块中的 this
下。
还有一个插曲:阅读 Kyle 的书。去听他的课。他是一位了不起的老师。
关于javascript - Eloquent JavaScript - 通过此关键字引用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227921/