我从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"
答案 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.a
中foo
试图访问全局对象上的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"
&#13;
在这里它运行在一个环境模糊,就像一个Node运行它:
(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;