Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript let绑定不应添加到全局对象中,这与浏览器、节点和JSFIDLE中的行为不同_Javascript_Node.js_Jsfiddle - Fatal编程技术网

JavaScript let绑定不应添加到全局对象中,这与浏览器、节点和JSFIDLE中的行为不同

JavaScript let绑定不应添加到全局对象中,这与浏览器、节点和JSFIDLE中的行为不同,javascript,node.js,jsfiddle,Javascript,Node.js,Jsfiddle,在本文中,我找到了以下一段文字: 在程序和函数的顶层,与var不同,let不在全局对象上创建属性 以及随附的示例代码: var x='全局'; 设y=‘全局’; console.logthis.x;//全球的 console.logthis.y;//未定义 当我将此代码添加到HTML文件时,如下所示: var x='全局'; 设y=‘全局’; console.logthis.x;//全球的 console.logthis.y;//未定义 福 我在控制台中获得了预期的输出: global unde

在本文中,我找到了以下一段文字:

在程序和函数的顶层,与var不同,let不在全局对象上创建属性

以及随附的示例代码:

var x='全局'; 设y=‘全局’; console.logthis.x;//全球的 console.logthis.y;//未定义 当我将此代码添加到HTML文件时,如下所示:

var x='全局'; 设y=‘全局’; console.logthis.x;//全球的 console.logthis.y;//未定义 福 我在控制台中获得了预期的输出:

global
undefined
但是,如果我在节点中运行代码,我会得到:

undefined
undefined
如果我在中运行相同的代码,我也会得到:

undefined
undefined
为什么会这样?全局对象在不同的运行时环境中的行为是否不同?这种行为记录在哪里

或者,在这些情况下,最高级别的程序是否有所不同


谢谢

顶层节点确实不同。请尝试以下操作:

// get access to the global object e.g. window, global
var g = (new Function('return this;'))();
var x = 1;
let y = 2;
console.log(typeof x); // 'number'
console.log(typeof y); // 'number'
console.log(typeof g.x); // 'undefined'
console.log(typeof g.y); // 'undefined'
您的代码在node中“起作用”的原因是,在node.js中,顶层的作用域是模块,而不是全局环境(如浏览器),这是node.js的一个重要功能,浏览器由于遗留原因无法添加。因此,let语句创建了一个模块级绑定。但是,如果要从其他模块导入该模块:

require('./path/to/module/with/xandy');
console.log(typeof x); // 'undefined'
console.log(typeof y); // 'undefined'
绑定未跨模块边界共享


至于fiddle,我只能假设他们正在进行某种沙箱处理,以阻止您的fiddle代码按预期工作。

顶层确实不同。谢谢!不幸的是,我不明白什么是var g=新函数“returnthis;”;意味着或者做着。或者为什么它在这里是相关的。当我这样做时,我得到了完全相同的结果:var g={};或者您是想写:var g=新函数returnthis?不,那是错误的out@NielsBom固定的对不起,我把这件事从我头上抹掉了。blurb是一种提供对全局对象的跨平台访问的黑客技术,即使在ES6模块这样的情况下也能工作,其中顶层对象尚未定义。