为什么在web和nodejs上运行JavaScript会有不同的输出?

Ali*_*ami 6 javascript node.js ecmascript-6

我已经更新了我Node.Js进入version 7.6.0和运行谷歌浏览器version 57.0的另一方面.

当我运行这段javascript代码时,我得到两个不同的结果,如下所示:

    'use strict'
    
    var obj = {
        id: "awesome",
        cool: function coolFn() {
            console.log(this.id);
        }
    };
    var id = "not awesome";
    obj.cool(); //awsome
    
    setTimeout(obj.cool, 100);
Run Code Online (Sandbox Code Playgroud)

铬的结果:

awesome
not awesome
Run Code Online (Sandbox Code Playgroud)

node.js上的结果:

awesome
undefined
Run Code Online (Sandbox Code Playgroud)

记录到https://nodejs.org/en/docs/es6/我甚至使用了--harmony标志,但node.js的结果没有改变.

Jam*_*rpe 5

当节点运行你的文件时,它被视为一个模块,文档说它有效地包装:

(function (exports, require, module, __filename, __dirname) {
  // Your module code actually lives in here
});
Run Code Online (Sandbox Code Playgroud)

这意味着它var id = "not awesome";在该模块包装器中作用域,并且不作为全局对象上的属性创建.

当计时器触发时,this设置为全局对象.所以在浏览器中,在var id全局范围内,您可以看到它,而在节点中,它是undefined.

如果我们将代码包装在浏览器中的函数中,您会看到相同的结果:

(function() {
    'use strict'
    
    var obj = {
        id: "awesome",
        cool: function coolFn() {
            console.log(this.id);
        }
    };
    var id = "not awesome";
    obj.cool(); //awsome
    
    setTimeout(obj.cool, 100);
})();
Run Code Online (Sandbox Code Playgroud)