foo.js
var bar = function () { return "hello world"; }
module.exports = {
bar: bar
}
test.js
var foo = require("foo.js");
var greeting1 = foo.bar;
var greeting2 = foo.bar();
var greeting3 = foo.bar;
在所有情况下,greeting1,greeting2,greeting3都有“hello world”的价值吗?
询问是否存在foo.bar最初未定义的情况,因为它尚未初始化并且仅在调用foo.bar()时初始化。
答案 0 :(得分:2)
你似乎有两个问题。
在所有情况下,greeting1,greeting2,greeting3都有“hello world”的价值吗?
嗯,不,不完全。 greeting1
和greeting3
变量包含一个函数foo.bar
。只有greeting2
包含字符串"hello world"
。在其他两种情况下,你没有实际调用函数,只是引用它并将其存储在变量中。
询问是否存在foo.bar最初未定义的情况,因为它尚未初始化并且仅在调用foo.bar()时初始化。
Node.js保证在您使用它时初始化foo.bar
。 require
函数是同步的 - 它会阻塞,直到加载请求的模块。因此,无需担心初始化,因为Node会为您处理。
答案 1 :(得分:2)
greeting1
和greeting3
是函数(它们都指向foo.js模块中的bar
函数)。
而greeting2 === "hello world"
因为它是执行bar
函数的返回结果。
这是因为您在某些地方使用foo.bar
而在其他地方使用foo.bar()
。一个只是获取函数,最后一个()
实际执行函数。
要以更简单的方式查看结果,让我们删除模块。您的代码等同于:
var foo = {
bar: function() { return "hello world"; }
};
var greeting1 = foo.bar; // contains a function reference
var greeting2 = foo.bar(); // contains "hello world" because it executed the function
var greeting3 = foo.bar; // contains a function reference
你问题的最后一句非常令人困惑。如果foo.bar
最初没有值(例如,它未定义),那么在它确实有值之前,您无法执行foo.bar()
。也许您需要向我们展示真实代码以及foo.bar
实际初始化的方式。在您的问题中,它始终具有初始值。