Javascript 关键字“的不同行为”;这";在node.js和浏览器之间

Javascript 关键字“的不同行为”;这";在node.js和浏览器之间,javascript,node.js,browser,Javascript,Node.js,Browser,我在ie、firefox和node.js中尝试了以下代码 var x = 10; var o = { x: 15 }; function f(){ console.log(this.x); } f(); f.call(o); 浏览器中的结果是10,15,但node.js中的结果是未定义的,15 请向我解释一下“this”关键字在浏览器和node.js中的不同行为?我读了很多页,但没有任何明显的答案。 提前感谢。在f()中调用常规函数时,严格模式与常规模式下的行为不同。在常规模式下,此

我在ie、firefox和node.js中尝试了以下代码

var x = 10;
var o = { x: 15 };
function f(){
     console.log(this.x);
}
f();
f.call(o);
浏览器中的结果是10,15,但node.js中的结果是未定义的,15

请向我解释一下“this”关键字在浏览器和node.js中的不同行为?我读了很多页,但没有任何明显的答案。
提前感谢。

f()
中调用常规函数时,严格模式与常规模式下的行为不同。在常规模式下,
将是全局对象(例如
窗口
)。在严格模式下,
将是
未定义的

除此之外,函数调用中
this
的赋值在javascript标准中完全指定,因此如果您在不同的情况下看到差异,那么可能是因为
严格
模式。将
strict
模式添加到这两个环境中,您将看到一致的行为


您可以阅读此处的“保护Javascript”部分了解更多信息。

加载到Nodejs中的Javascript文件自动包装在匿名函数中

因此,在Node中,您真正运行的是:

(function(/* There are args here, but they aren't important for this answer */){
  var x = 10;
  var o = { x: 15 };
  function f(){
    console.log(this.x);
  }
  f();
  f.call(o);
})();
浏览器不会执行此操作。问题是,现在在Node
x
中,它只是函数范围内的一个普通变量,而不是全局范围的一部分。这样调用
f()
时,
f
中的
this
是全局范围

如果直接将
x
放在全局范围内,则在这两种情况下都有效

this.x = 10;
这将把
x
放置在浏览器中的
窗口中的
全局对象上,并将
全局对象放置在节点中


通常,您不会在节点中全局加载内容,而是将代码分组到模块中,如图所示。您可以访问有关各种全球事物的信息。如果您对包装器感兴趣,您可以看到它。

默认情况下,Node.js可能以严格模式运行。。。(在严格模式下,
,在函数内部,从不强制全局对象。)如何将此代码加载到node.js?如果加载node.js代码的任何东西都将其解析为函数体,如通过
新函数(javascriptSourceCode)(
),您就会看到这种行为,因为
var x
将声明函数的局部变量,而不是顶级全局变量。@ŠimeVidas,在这种情况下,您将得到一个异常取消引用
null
,对于
this.x
@MikeSamuel是的,我的错误。@MikeSamuel,我将代码复制到一个文件test.js中,并运行该文件。否,严格模式与OPs问题无关。如果
未定义
函数将抛出,但它会记录
未定义
(因此
在两种情况下都是全局对象)。非常感谢。“你能给我一些关于这个的nodejs文档吗?”聪圭在最后补充了一点。