javascript - node.js 和浏览器之间关键字 "this"的不同行为

标签 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中的结果是undefined,15。

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

最佳答案

在 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 .还有如果你对wrapper好奇的话可以看看here .

关于javascript - node.js 和浏览器之间关键字 "this"的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895651/

相关文章:

javascript - 调用addEventListener调整大小一次?

javascript - 如何找出发出警报的位置?

browser - 微软边缘浏览器。错误 SEC7117

Javascript选择div并更改里面的href

javascript - 对象不支持此属性或方法 - 仅 IE8?

javascript - 如何从 ajax 数据绘制 highstock 单线系列图

javascript - 是否可以在页面加载后的给定时刻禁用特定页面上的所有 javascript 执行?

node.js - 在 Heroku 上使用 Laravel + Redis + Node.js for websocket app ...担心连接限制

javascript - 使用 Firebase Cloud Functions 批量写入

jquery - Angular4 找不到 Jquery-UI 函数