如果 let
关键字引入了块范围的正确实现,确实如此 var
再有一个用例?我从软件设计的角度看这个,而不是语法,“你能做到”的立场。
如果 let
关键字引入了块范围的正确实现,确实如此 var
再有一个用例?我从软件设计的角度看这个,而不是语法,“你能做到”的立场。
如果
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
物体 环境记录 全局环境记录的组件包含所有内置全局变量的绑定(第18条)以及由a引入的所有绑定 FunctionDeclaration, GeneratorDeclaration, 要么 VariableStatement 包含在全局代码中。全局代码中所有其他ECMAScript声明的绑定包含在全局环境记录的声明性环境记录组件中。
但是,这也可以通过创建一个轻松解决 明确的 全局变量使用直接分配给全局对象:
window.foo = 42;
这也是创建全局类btw的唯一方法,因为 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
尚未初始化的变量。
let
不能在全球范围内使用 然而。 var
能够。
这是您在尝试全局时从Chrome获得的内容 let
在严格模式之外:
在严格模式之外尚不支持块范围的声明(let,const,function,class)
实际上我发现了一些用于自己的用例。
有时你可能想在try-catch中声明变量,如下所示:
try {
//inits/checks code etc
let id = getId(obj);
var result = getResult(id);
} catch (e) {
handleException(e);
}
//use `result`
同 let
该 result
宣言将在之前 try
对于作者和代码的读者而言,这有点早,并且脱离了上下文。
条件声明也是如此:
if (opts.re) {
var re = new RegExp(opts.re);
var result = match(re);
if (!result) return false;
}
//use result here safely
同 let
这段代码有点被迫抱怨“好风格”,尽管这可能是不切实际的。
另外我可以想象你想使用属于循环块的变量的情况:
for (var x = 0; x < data.width; x++) {
if (data[x] == null) break;
//some drawing/other code
}
//here we have the `x` pointing to the end of data
有美容标准的人可能会认为不整洁,我自己更喜欢 let
s,但如果我编辑的代码已经包含 var
s - 使用它们很自然,使编码更容易。
您可以使用 var
如果你想在函数范围内解构某些东西,例如条件:
if (Math.random() > 0.5)
var {a,b} = {a: 1, b: 2}
else
var {a,b} = {a: 10, b: 20}
// Some common logic on a and b
console.log(a, b)
同 let
你必须写类似的东西
let result;
if (Math.random() > 0.5)
result = {a: 'foo', b: 'bar'}
else
result = {a: 'baz', b: 'qux'}
// Using const might make more sense here
let {a, b} = result;
// Some common logic on a and b
console.log(a,b)