YDKJS - '这个'怎么样?

时间:2017-11-09 16:55:56

标签: javascript node.js this

我从YDKJS复制了代码,作者预期输出是'oops global',但是当我在Node中运行它时,我得到'未定义'。为什么呢?

function foo() {
  console.log(this.a);
}

var obj = {
  a: 2,
  foo: foo
};

var bar = obj.foo; // function reference/alias!

var a = "oops, global"; // `a` also property on global object

bar(); // "oops, global"

1 个答案:

答案 0 :(得分:2)

以正常方式在Node中运行代码时:

node implicitLost.js

... Node将您的代码作为模块运行,而不是在全局范围内运行。那里显示的代码只输出&#34; oops,global&#34;如果它在全局范围内运行(例如,在浏览器中的<script>...</script>)。 (当您从另一个脚本中require(...)代码时,节点也会执行此操作。)

您可以使用Node的REPL(注意node重定向)将代码管道传输到<而不是将其作为参数提供,从而在全局范围内运行代码:

node < implicitLost.js

为什么重要:

在模块中运行时,由于var a = "oops, globals";位于模块范围内,因此仅在该模块中定义;它不会成为全球性的。因此this.afoo试图访问全局对象上的a,但却看不到它。

以下代码在全球范围内运行:

&#13;
&#13;
function foo() {
  console.log(this.a);
}

var obj = {
  a: 2,
  foo: foo
};

var bar = obj.foo; // function reference/alias!

var a = "oops, global"; // `a` also property on global object

bar(); // "oops, global"
&#13;
&#13;
&#13;

在这里它运行在一个环境模糊,就像一个Node运行它:

&#13;
&#13;
(function() {
  function foo() {
    console.log(this.a);
  }

  var obj = {
    a: 2,
    foo: foo
  };

  var bar = obj.foo; // function reference/alias!

  var a = "oops, global"; // `a` also property on global object

  bar(); // "oops, global"
})();
&#13;
&#13;
&#13;