javascript属性函数的初始值

时间:2015-01-24 20:06:47

标签: javascript node.js initialization commonjs node-modules

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()时初始化。

2 个答案:

答案 0 :(得分:2)

你似乎有两个问题。

  

在所有情况下,greeting1,greeting2,greeting3都有“hello world”的价值吗?

嗯,不,不完全。 greeting1greeting3变量包含一个函数foo.bar。只有greeting2包含字符串"hello world"。在其他两种情况下,你没有实际调用函数,只是引用它并将其存储在变量中。

  

询问是否存在foo.bar最初未定义的情况,因为它尚未初始化并且仅在调用foo.bar()时初始化。

Node.js保证在您使用它时初始化foo.barrequire函数是同步的 - 它会阻塞,直到加载请求的模块。因此,无需担心初始化,因为Node会为您处理。

答案 1 :(得分:2)

greeting1greeting3是函数(它们都指向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实际初始化的方式。在您的问题中,它始终具有初始值。