【问题标题】:different behavior of keyword "this" between node.js and browsersnode.js和浏览器之间关键字“this”的不同行为
【发布时间】:2012-12-16 05:04:29
【问题描述】:

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

【问题讨论】:

  • 也许 Node.js 默认在严格模式下运行...(在严格模式下,this,在函数内部,从不强制转换为全局对象。)
  • 如何将这段代码加载到 node.js 中?如果加载 node.js 代码的任何内容都像通过 new Function(javascriptSourceCode)() 那样将其解析为函数体,您会看到这种行为,因为 var x 将声明一个函数的本地变量,而不是顶级全局变量。
  • @ŠimeVidas,在这种情况下,您会得到一个异常取消引用 null,而不是 undefinedthis.x
  • @MikeSamuel 是的,我的错。
  • @MikeSamuel,我将代码复制到文件 test.js 并运行该文件

标签: javascript node.js browser


【解决方案1】:

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 放在浏览器中的window 全局对象上,并将global 放在Node 中的全局对象上。

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

【讨论】:

  • 非常感谢。你能给我任何关于那个的nodejs文档吗?
  • @CongNguyen 在最后添加了一点。
【解决方案2】:

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

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

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

【讨论】:

  • 不,严格模式与 OP 问题无关。如果thisundefined,该函数会抛出,但它会记录undefined(因此this 在这两种情况下都是全局对象)。
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
相关资源
最近更新 更多