浏览器和节点之间有什么区别?

isl*_*205 6 javascript browser node.js

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

setName.js 在节点上:

var setName;
setName = function (name) {
    return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//undefined
console.log(this.name);
Run Code Online (Sandbox Code Playgroud)

setName.html 在浏览器中:

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

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

Mat*_*all 8

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

在浏览器中,顶级范围是全局范围.这意味着在浏览器中,如果您在全局范围内var something将定义全局变量.在Node中,这是不同的.顶级范围不是全球范围; var somethingNode模块内部将是该模块的本地模块.

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


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

> this === global
true
Run Code Online (Sandbox Code Playgroud)

进一步阅读@ 如何节点:什么是"这个?"


好了,按照提示通过一个多编辑@ SIME维达斯关于评论thisES5严格模式:

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

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

  • 考虑通过添加有关严格模式的信息,使您的答案更加面向未来.(在函数体中,除非通过调用方法显式设置,否则`this`是未定义的.) (3认同)