【问题标题】:YDKJS - How 'this' working? [duplicate]YDKJS - “这个”是如何工作的? [复制]
【发布时间】:2018-04-22 18:46:56
【问题描述】:

我从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"

【问题讨论】:

  • 我没有对代码进行任何编辑,复制并保存为implicitLost.js,并在终端中以“nodeimplicitLost.js”的形式运行,输出为“undefined”
  • 感谢您添加运行它的信息,Ramesh;它使一切变得不同! :-)(我已将其编辑到问题中。)

标签: javascript node.js this


【解决方案1】:

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

节点implicitLost.js

...Node 将您的代码作为 模块 运行,而不是在全局范围内。如果在全局范围内运行(例如,在浏览器中的 <script>...</script> 中),那里显示的代码只会输出“oops, global”。 (当您 require(...) 来自另一个脚本的代码时,Node 也会这样做。)

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

节点

为什么重要:

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

这是在全局范围内运行的代码:

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"

这里它在一个模糊的环境中运行,就像一个节点在其中运行它:

(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"
})();

【讨论】:

  • 它有效...非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2014-05-08
相关资源
最近更新 更多