JavaScript let绑定不应添加到全局对象中,这与浏览器、节点和JSFIDLE中的行为不同
在本文中,我找到了以下一段文字: 在程序和函数的顶层,与var不同,let不在全局对象上创建属性 以及随附的示例代码: var x='全局'; 设y=‘全局’; console.logthis.x;//全球的 console.logthis.y;//未定义 当我将此代码添加到HTML文件时,如下所示: var x='全局'; 设y=‘全局’; console.logthis.x;//全球的 console.logthis.y;//未定义 福 我在控制台中获得了预期的输出: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
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模块这样的情况下也能工作,其中顶层对象尚未定义。