node.js和browser之间关键字"this"的不同行为

Con*_*yen 5 javascript browser node.js

我已经尝试在firefox和node.js中使用代码

var x = 10;
var o = { x: 15 };
function f(){
     console.log(this.x);
}
f();
f.call(o);
Run Code Online (Sandbox Code Playgroud)

浏览器中的结果是10,15,但node.js中的结果是未定义的,15.

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

log*_*yth 6

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);
})();
Run Code Online (Sandbox Code Playgroud)

浏览器不会这样做.问题是,现在Node x中只是函数范围内的正常变量,它不是全局范围的一部分.当你调用f()这个方法,thisf是全局范围.

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

this.x = 10;
Run Code Online (Sandbox Code Playgroud)

这将放置x在上window浏览器全局对象,并global在节点全局对象.

通常,您不会在Node中全局加载内容,而是将代码分组到模块中,如此处所述.有关于您可以在此处访问的各种全球事物的信息.如果你对包装器很好奇,你可以在这里看到它.