node.js和浏览器之间关键字“this”的不同行为
我已经尝试下面的代码,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”关键字的不同行为是什么? 我读了很多页面,但没有任何明显的答案。 提前致谢。
在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
中只是函数范围内的一个普通variables,它不是全局范围的一部分。 当以这种方式调用f()
, this
的f
就是全局范围。
如果直接把x
放在全局范围内,它将在两种情况下都起作用。
this.x = 10;
这将把x
放置在浏览器中的window
全局对象上,以及Node中的global
全局对象上。
一般来说,您不需要在Node中全局加载内容,而是将您的代码分组到模块中,如下所述 。 有关于你可以在这里访问的各种全球性的东西的信息。 如果你对包装好奇,你可以在这里看到。
在f()
调用常规函数时,严格模式与常规模式的行为不同。 在常规模式下, this
将是全局对象(例如window
)。 在严格模式下, this
将是undefined
。
除了这个区别之外, this
在函数调用中的赋值在javascript标准中是完全指定的,所以如果你在不同的情况下看到差异,那很可能是因为strict
模式。 strict
模式添加到这两个环境,你应该看到一致的行为。
你可以在这个MDN参考中阅读“保护Javascript”部分以获取更多信息。