5

我在 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 中的不同行为是什么?我已经阅读了很多页,但没有任何明显的答案。提前致谢。

4

2 回答 2

7

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

浏览器不这样做。问题是现在在 Nodex中只是函数范围内的一个普通变量,它不是全局范围的一部分。当您f()以这种方式调用时,thiswithinf是全局范围。

如果直接放在x全局作用域上,这两种情况都可以。

this.x = 10;

这将放置xwindow浏览器中的global全局对象和 Node.js 中的全局对象上。

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

于 2012-12-15T20:16:08.593 回答
2

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

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

您可以阅读此MDN 参考中的“保护 Javascript”部分以获取更多信息。

于 2012-12-15T20:03:59.707 回答