【问题标题】:javascript initial value of property functionjavascript属性函数的初始值
【发布时间】:2015-03-23 15:51:08
【问题描述】:

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

【问题讨论】:

  • 在该代码中,greeting1greeting3 将是函数,而不是字符串。

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


【解决方案1】:

你这里似乎有两个问题。

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

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

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

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

【讨论】:

  • 这不是问题的答案。他询问属性bar 是否是“hello world”——它不是,因为除非它被调用,否则它将指向该函数。正如您在评论中所说的那样......(?)您在答案中提供的(有用的)信息比在评论中提供的信息少:)
  • @Someone IMO,问题不清楚,我对此发表了评论,反映了这一点。然而,最后一句话似乎在问真正的问题:“问是因为如果存在 foo.bar 最初是未定义的场景,因为它没有被初始化,只有在 foo.bar() 被调用时才被初始化。”跨度>
  • 是的,但这仅表明 OP 对任何事情的工作原理完全感到困惑(对不起,OP),似乎 - 更有理由提供完整的解释,不是吗?
  • @Someone 够公平的;我已经编辑了一些额外的信息来澄清。
  • 其实再读一遍OP的最后一句话,bar怎么可能是undefined,如果还没有被调用应该是一个函数……哦等等,不,就像我说 - OP 很困惑,他猜测没有报告实际观察结果 :) 对 OP:它不会是未定义的,它将是一个函数或一个字符串。
【解决方案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 的实际初始化方式。在你的问题中,它总是有一个初始值。

【讨论】:

  • 感谢 jfriend00 我错误地认为加载时的 foo.js 可能会执行匿名函数并将结果分配给 var bar 并因此分配给 greeting1 = greeting2 = greeting3 = 'hello world' ...但似乎 var bar = function() {} 是和function bar() {}一样的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2014-10-27
  • 2012-12-15
  • 2019-03-30
  • 2014-09-23
  • 1970-01-01
相关资源
最近更新 更多