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

时间:2012-12-15 19:55:50

标签: 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。

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

2 个答案:

答案 0 :(得分: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);
})();

浏览器不会这样做。问题是现在在节点x中只是函数范围内的正常变量,它不是全局范围的一部分。当您以这种方式致电f()时,this内的f是全球范围。

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

this.x = 10;

这会将x放在浏览器中的window全局对象上,以及Node中的global全局对象。

通常,您不会在Node中全局加载内容,而是将代码分组为模块,如described here。有关于您可以访问的各种全局内容的信息here。如果您对包装器感到好奇,可以看到它here

答案 1 :(得分:2)

f()中调用常规函数时,严格模式与常规模式的行为不同。在常规模式下,this将成为全局对象(例如window)。在严格模式下,this将为undefined

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

您可以在此MDN reference阅读“保护Javascript”部分以获取更多信息。