浏览器和节点有什么区别

what's the difference between Browsers and Node?

本文关键字:什么 区别 节点 浏览器      更新时间:2023-09-26

浏览器和节点有什么区别?例如:

节点上的setName.js

var setName;
setName = function (name) {
    return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//undefined
console.log(this.name);

在浏览器中setName.html

<script>
    var setName;
    setName = function (name) {
        return this.name = name;
    };
    setName("LuLu");
    //LuLu
    console.log(name);
    //LuLu
    console.log(this.name);
</script>

第二个日志不同,为什么?

Node 是一个 JavaScript 引擎,而不是浏览器。您在 Node 中看到undefined,而在浏览器中看到Lulu的具体原因是什么?全局命名空间的差异:

在浏览器中,顶级作用域是全局作用域。这意味着在浏览器中,如果您在全局范围内,var something将定义一个全局变量。在 Node 中,这是不同的。顶级作用域不是全局作用域; 节点模块内部var something将是该模块的本地。

在浏览器中,this是对window对象(浏览器的全局命名空间(的引用,用于所有未附加到对象的函数(例如,不像foo.bar()(。在 Node 中,this 根本不是对全局命名空间的引用。


:注: 节点解释器中的console.log(this.name)将打印Lulu,而不是undefined。这是因为,仅在 REPL 中,

> this === global
true

延伸阅读@如何节点:"这个"是什么?


好的,根据 @Šime Vidas 关于 ES5 严格模式下this的评论提示,再进行一次编辑:

  • 在全局上下文中(在任何函数之外(,this 引用全局对象,无论是否处于严格模式。
  • this 关键字出现在函数内部时,其值取决于函数的调用方式。
  • 当函数作为对象的方法调用时,其this设置为调用该方法的对象。

更有趣的阅读由Juriy Zaytsev(又名@kangax(在他的一篇博客文章中提供。

您的浏览器代码具有 window 主机对象。节点没有该主机对象。当你设置this.name时,你实际上是在将其设置为window对象,也就是创建一个全局变量。

window.name === this.name // true