当前位置: 首页 > 面试题库 >

let语句是否在全局对象上创建属性?

湛同
2023-03-14
问题内容

在JavaScript中,var声明在全局对象上创建属性:

var x = 15;
console.log(window.x); // logs 15 in browser
console.log(global.x); // logs 15 in Node.js

ES6引入let了具有作用域范围的声明的词法作用域。

let x = 15;
{
   let x = 14;
}
console.log(x); // logs 15;

但是,这些声明是否在全局对象上创建属性?

let x = 15;
// what is this supposed to log in the browser according to ES6?
console.log(window.x); // 15 in Firefox
console.log(global.x); // undefined in Node.js with flag

问题答案:

let语句是否在全局对象上创建属性?

根据规范,否:

全局环境记录在逻辑上是单个记录,但是它被指定为封装对象环境记录和声明性环境记录的复合记录。该对象环境记录作为其基本对象相关的全局对象境界。该全局对象是全局环境记录的GetThisBinding具体方法返回的值。全局环境记录的对象环境记录组件包含所有内置全局变量的绑定(第18节)以及全局代码中包含的FunctionDeclaration,GeneratorDeclaration或VariableStatement引入的所有绑定。全局代码中所有其他ECMAScript声明的绑定都包含在全局环境记录的声明性环境记录组件中。

一些更多的解释:

  • 声明 环境记录存储在内部数据结构中的绑定。不可能以任何方式掌握该数据结构(考虑功能范围)。

  • 一个 对象 环境记录使用的实际JS对象作为数据结构。对象的每个属性都将成为绑定,反之亦然。全局环境具有一个对象环境对象,其“绑定对象”是全局对象。另一个例子是with

现在,正如引用部分所述,只有 FunctionDeclarationGeneratorDeclaration
VariableStatement会 在全局环境的 对象 环境记录中创建绑定。即,只有此绑定才成为全局对象的属性。

所有其他声明(例如constlet)都存储在全局环境的 声明性 环境记录中,该记录不是基于全局对象的。



 类似资料:
  • 在JavaScript中,声明在全局对象上创建属性: ES6使用具有块作用域的声明引入词法作用域。 但是,这些声明是否在全局对象上创建属性?

  • 出于业务逻辑的原因,我希望能够创建一个具有属性的对象。但我显然不能 因为是在Python中具有特殊含义的保留关键字。但是,使用或动态获取属性也存在同样的问题。我可以这样做吗,还是必须让属性名?

  • 问题内容: node.js是否支持let语句,类似于MDN上描述的内容?? 如果没有,是否可以通过自执行匿名功能或其他方式复制功能? 和/或还有另一个js环境 有和 像节点一样具有REPL?犀牛? 编辑 : 这个问题是很久以前问过的。截至2015年末,答案是“是的,是的”。io.js 3.3中默认包含Harmony功能,并且最近已在4.x版本中将其恢复到node.js。 问题答案: 我不认为Nod

  • 问题内容: 什么是 全球声明 ?以及如何使用?我已经阅读了Python的官方定义; 但是,这对我来说没有多大意义。 问题答案: python中的每个“变量”都限于特定范围。python“文件”的范围是模块范围。考虑以下: 具有局部作用域的对象会在函数退出后立即死亡,并且永远无法检索(除非您拥有它们),但是在函数内,您可以访问模块级作用域(或任何包含的作用域)中的变量: 但是,您不能在该引用上使用赋

  • 问题内容: 例如: 相对于: 一个比另一个更有效吗? 问题答案: 返回之前分配给临时变量使您有机会从newPerson()中进行错误检查和更正。返回新的调用要求newPerson()方法的调用者捕获错误并从错误中恢复。

  • 问题内容: 我最近了解到,可以在语句中创建新的对象,如下所示: 这是要避免的事情还是应该接受?根据良好实践,何时才可以合理使用此功能? 问题答案: 不要回避它 ,因为有第 10.2.7.2节 所提醒的,因为它有完全有效的用例,所以这里有SELECT NEW 。 EJB 3.0 JPA规范 的SELECT子句 中的 JPQL构造函数表达式 : SELECT列表中可以使用构造函数来返回一个或多个Jav