为什么我需要在我的 LIFE 中使用 exports / this 构造才能在 Node REPL 中访问它?
Why do I need to use an exports / this construction in my IIFE for it to be accessible in Node REPL?
为什么当我在 Node REPL 中需要它时,我的 javascript 代码的第一个版本 return 未定义,而第二个版本有效?
当我在浏览器控制台中 运行 以下两个版本的代码时,它们似乎都在执行我想要的操作(功能有效,var text 保持私有)。这促使我问为什么我需要为第二个版本中的 exports / this 构造烦恼。
但是我注意到,如果我在 Node REPL 中需要它,第一个版本(没有那个构造)就不起作用,所以很明显导出/这是在做一些我不明白的额外事情。
谁能用简单的术语解释为什么有必要(我对 JS 比较陌生)。
没有 IIFE 和 exports/this 的第一个版本:
function Note(string) {
var text = string;
function getText() {
return text;
}
return {
getText: getText
}
}
带有 IIFE 和 exports/this 的第二个版本:
(function(exports) {
function Note(string) {
var text = string;
function getText() {
return text;
}
return {
getText: getText
}
}
exports.Note = Note;
})(this);
你说过你是 "requiring"。当您这样做时,代码将被视为 Node 模块。 (Node 几乎总是将您的代码视为一个模块。)模块代码不在全局范围内,它在特定于您的模块的范围内。这就是为什么您需要从中导出您想要导出的内容(默认情况下其他所有内容都是私有的)。
相比之下,在浏览器中,除非你故意做一些事情来防止它成为全局的,否则它是全局的,所以你的代码没有包装器和导出创建一个全局 Note
when 运行 in全局范围。
在 modules documentation 中,它们向您展示了当作为模块加载时您的代码 运行:
(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});
然后这样调用 this
是 exports
对象(this === exports
是真的),尽管我没有在任何地方看到这个记录,当然也不会使用这个事实.
为什么当我在 Node REPL 中需要它时,我的 javascript 代码的第一个版本 return 未定义,而第二个版本有效?
当我在浏览器控制台中 运行 以下两个版本的代码时,它们似乎都在执行我想要的操作(功能有效,var text 保持私有)。这促使我问为什么我需要为第二个版本中的 exports / this 构造烦恼。
但是我注意到,如果我在 Node REPL 中需要它,第一个版本(没有那个构造)就不起作用,所以很明显导出/这是在做一些我不明白的额外事情。
谁能用简单的术语解释为什么有必要(我对 JS 比较陌生)。
没有 IIFE 和 exports/this 的第一个版本:
function Note(string) {
var text = string;
function getText() {
return text;
}
return {
getText: getText
}
}
带有 IIFE 和 exports/this 的第二个版本:
(function(exports) {
function Note(string) {
var text = string;
function getText() {
return text;
}
return {
getText: getText
}
}
exports.Note = Note;
})(this);
你说过你是 "requiring"。当您这样做时,代码将被视为 Node 模块。 (Node 几乎总是将您的代码视为一个模块。)模块代码不在全局范围内,它在特定于您的模块的范围内。这就是为什么您需要从中导出您想要导出的内容(默认情况下其他所有内容都是私有的)。
相比之下,在浏览器中,除非你故意做一些事情来防止它成为全局的,否则它是全局的,所以你的代码没有包装器和导出创建一个全局 Note
when 运行 in全局范围。
在 modules documentation 中,它们向您展示了当作为模块加载时您的代码 运行:
(function(exports, require, module, __filename, __dirname) { // Module code actually lives in here });
然后这样调用 this
是 exports
对象(this === exports
是真的),尽管我没有在任何地方看到这个记录,当然也不会使用这个事实.