If the let
关键字引入了块作用域的正确实现,var
还有用例吗?我是从软件设计的角度来看这个问题的,而不是从语法的“你可以”的角度来看的。
If the let
关键字引入了块作用域的正确实现,var
还有用例吗?
可能有一种用例: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
From 8.1.1.4 全球环境记录
物体环境记录全局环境记录的组件包含所有内置全局变量的绑定(第18条) 以及由 a 引入的所有绑定函数声明, 生成器声明, or 变量语句包含在全局代码中。全局代码中所有其他 ECMAScript 声明的绑定都包含在全局环境记录的声明性环境记录组件中。
然而,这也可以通过创建一个轻松解决explicit全局变量通过直接分配给全局对象来使用:
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
不过,块作用域并不是唯一有用的功能。这颞死区是另一个方便的功能,可以更轻松地发现错误。比较:
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
尚未初始化的变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)