当前位置: 首页 > 知识库问答 >
问题:

让语句在全局对象上创建属性吗?

敖和韵
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

共有3个答案

公冶嘉茂
2023-03-14

根据规范:

这意味着您应该能够在执行范围内访问变量,但不能在执行范围外访问。这将执行范围扩展到经典的JS闭包结构(仅函数或全局)之外。

全局定义一个let变量可以解释这个问题,正如你在Firefox中看到的那样,它绑定了一个全局变量,而V8/iojs没有绑定。

值得一提的是控制台。日志(x的类型)将在iojs中返回编号。在实践中,您不应该尽可能多地在模块或函数之外定义变量。。。尤其是constlet

燕正卿
2023-03-14

如果在脚本的顶层声明了letvar变量,则可以在脚本文件之外访问它们。但是,只有var变量被分配给窗口对象。请查看此代码片段作为证明:

<script>
  var namedWithVar = "with var";
  let namedWithLet = "with let";
</script>

<script>
  console.log("Accessed directly:");
  console.log(namedWithVar);        // prints: with var
  console.log(namedWithLet);        // prints: with let
  console.log("");

  console.log("Accessed through window:");
  console.log(window.namedWithVar); // prints: with var
  console.log(window.namedWithLet); // prints: undefined
</script>
苏彭薄
2023-03-14

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

根据规范,没有:

全局环境记录在逻辑上是单个记录,但它被指定为封装对象环境记录和声明性环境记录的复合记录。对象环境记录的基本对象是关联的Realm的全局对象。此全局对象是全局环境记录的GetThisBinding具体方法返回的值。全局环境记录的对象环境记录组件包含所有内置全局变量的绑定(子句18)以及全局代码中包含的Function声明、生成器声明或变量声明引入的所有绑定。全局代码中所有其他ECMAScript声明的绑定包含在全局环境记录的声明性环境记录组件中。

还有一些解释:

>

  • 声明性环境记录将绑定存储在内部数据结构中。以任何方式获取该数据结构都是不可能的(想想函数范围)。

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

    现在,正如所引用的部分所述,只有FunctionDeclarations、GeneratorDeclarations和Variable语句在全局环境的对象环境记录中创建绑定。即只有这个绑定成为全局对象的属性。

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

  •  类似资料:
    • 问题内容: 在JavaScript中,声明在全局对象上创建属性: ES6引入了具有作用域范围的声明的词法作用域。 但是,这些声明是否在全局对象上创建属性? 问题答案: 语句是否在全局对象上创建属性? 根据规范,否: 全局环境记录在逻辑上是单个记录,但是它被指定为封装对象环境记录和声明性环境记录的复合记录。该对象环境记录作为其基本对象相关的全局对象境界。该全局对象是全局环境记录的GetThisBin

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

    • 全局属性 全局属性通过 fis.set 设置,通过 fis.get 获取; 内置的默认配置 var DEFAULT_SETTINGS = { project: { charset: 'utf8', md5Length: 7, md5Connector: '_', files: ['**'], ignore: ['node_modules/**', 'ou

    • 全局对象提供可在任何地方使用的变量和函数。默认情况下,这些全局变量内置于语言或环境中。 在浏览器中,它的名字是 “window”,对 Node.js 而言,它的名字是 “global”,其它环境可能用的是别的名字。 最近,globalThis 被作为全局对象的标准名称加入到了 JavaScript 中,所有环境都应该支持该名称。所有主流浏览器都支持它。 假设我们的环境是浏览器,我们将在这儿使用 “

    • 问题内容: 我是Java的新手,并且开始使用Java 。我想做的是为学生创建一个。每个学生都有与其相关的不同属性()。我试图弄清楚如何使用此属性添加新的学生对象。这是我所拥有的: 问题答案: 您需要的是以下内容:

    • 我创建了一个对象数组,如下所示: 我正在尝试创建一个新数组,该数组过滤位置,使其仅包含不具有相同城市属性的对象(lat/lng重复项可以)。是否有内置的JS或Jquery函数来实现这一点?