gpt4 book ai didi

ecmascript-6 - ES6 中 var 的用例是什么?

转载 作者:行者123 更新时间:2023-12-03 20:16:28 25 4
gpt4 key购买 nike

如果 let关键字引入了 block 作用域的正确实现,var不再有用例了吗?我是从软件设计的角度而不是句法的“你可以”的角度来看待这个问题。

最佳答案

If the let keyword introduces a proper implementation of block scope, does var any longer have a use case?



可能有一个用例: let全局范围内的声明不会在全局对象上创建属性。例子:

"use strict"; // for chrome
var foo = 42;
let bar = 21;
console.log('window.foo (var)', window.foo); // 42
console.log('window.bar (let)', window.bar); // undefined


来自 8.1.1.4 Global Environment Records

The object Environment Record component of a global Environment Record contains the bindings for all built-in globals (clause 18) and all bindings introduced by a FunctionDeclaration, GeneratorDeclaration, or VariableStatement contained in global code. The bindings for all other ECMAScript declarations in global code are contained in the declarative Environment Record component of the global Environment Record.



但是,这也可以通过创建 来轻松解决。显式 通过直接分配给全局对象来使用全局变量:
window.foo = 42;

顺便说一句,这也是创建全局类的唯一方法,因为 class声明具有相同的行为。

(注:我不提倡使用全局变量)

有些语法结构只能使用 var ,但这更多是规范演变的结果,并没有真正用于任何实际目的。例如:
if (true)
var foo = 42; // valid but kind of useless or bad design

// vs

if (true)
let foo = 42; // invalid

block 范围并不是唯一有用的功能。 temporal dead zone是另一个方便的功能,可以更轻松地找到错误。比较:
var foo = 42;
function bar() {
console.log(foo); // undefined
var foo = 21;
}
bar();

// vs

var foo = 42; // or `let`, doesn't matter
function bar() {
console.log(foo); // ReferenceError, temporal dead zone
let foo = 21;
}
bar();

尝试访问 let 时出现引用错误尚未初始化的变量。

关于ecmascript-6 - ES6 中 var 的用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31836796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com