【问题标题】:what's the difference between Browsers and Node?浏览器和节点有什么区别?
【发布时间】:2011-12-25 01:18:50
【问题描述】:

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

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>

第二个日志不一样,为什么?

【问题讨论】:

  • 真的是“未定义”,我的节点版本是v0.4.10
  • (1) 我们尽量避免浏览器中的全局变量。 (2) 你想开始写严格模式的代码,在这种情况下上面的代码会抛出...

标签: javascript browser node.js


【解决方案1】:

Node 是 JavaScript 引擎,而不是浏览器。您在 Node 中看到 undefined 而在浏览器中看到 Lulu 的具体原因是什么? Differences in the global namespace:

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

在浏览器中,this 是对 window 对象(浏览器的全局命名空间)的引用,适用于所有被调用的独立于对象的函数(例如 not,如 foo.bar()) .在 Node 中,this 根本不是对全局命名空间的引用。


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

> this === global
true

延伸阅读@How To Node: What is "this?"


好的,根据@Šime Vidas'thisES5 strict mode 中的评论的提示,再进行一次编辑:

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

更多有趣的阅读由Juriy Zaytsev (aka @kangax)one of his blog posts 提供。

【讨论】:

  • 考虑通过添加有关严格模式的信息使您的答案更面向未来。 (在函数体中,this 是未定义的,除非由调用方法显式设置。)
  • 我想知道为什么console.log this.name输出undefined
  • @island205 因为除非你在 REPL,否则this !== global。查看浏览器中的console.log(this)、REPL 和节点脚本之间的区别。我不知道这些差异的确切原因,但我知道 NodeJS 不是浏览器。
  • @island205 你所说的“差异”是什么意思?您是在问“为什么在 Node 和浏览器中会有不同?”
  • `这些差异的确切原因`。原谅我的粗心
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2020-09-16
    • 2015-10-23
    相关资源
    最近更新 更多