Ecmascript 6 ES6中var的用例是什么?

Ecmascript 6 ES6中var的用例是什么?,ecmascript-6,Ecmascript 6,如果let关键字引入了块范围的正确实现,那么var是否还有用例?我是从软件设计的角度来看这一点的,而不是从语法上的“嗯,你可以”的角度来看这一点。let还不能用于全局范围变量可以 这是当您尝试在严格模式之外使用全局let时,从Chrome获得的结果: 在严格模式外尚不支持块作用域声明(let、const、函数、类) 如果let关键字引入了块范围的正确实现,那么var是否还有用例 可能有一个用例:让全局范围中的声明不在全局对象上创建属性。例如: “严格使用”//铬 var-foo=42; 设ba

如果
let
关键字引入了块范围的正确实现,那么
var
是否还有用例?我是从软件设计的角度来看这一点的,而不是从语法上的“嗯,你可以”的角度来看这一点。

let
还不能用于全局范围<代码>变量可以

这是当您尝试在严格模式之外使用全局
let
时,从Chrome获得的结果:

在严格模式外尚不支持块作用域声明(let、const、函数、类)

如果
let
关键字引入了块范围的正确实现,那么
var
是否还有用例

可能有一个用例:
让全局范围中的
声明不在全局对象上创建属性。例如:

“严格使用”//铬
var-foo=42;
设bar=21;
console.log('window.foo(var)',window.foo);//42

console.log('window.bar(let)'和window.bar);//未定义
实际上,我为自己找到了一些用例

有时您可能希望在try-catch中声明变量,如下所示:

try {
    //inits/checks code etc
    let id = getId(obj);

    var result = getResult(id);
} catch (e) {
    handleException(e);
}

//use `result`
使用
let
时,
结果
声明将在
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
for(var x=0;x

有高美貌标准的人可能认为不整洁,我自己更喜欢<>代码> s,但是如果我编辑的代码已经包含了<代码> var >代码> s -这是很自然的使用它们并使代码更容易。

你可以使用<代码> var >代码>如果你想把一些东西分解成函数范围,例如条件:

if(Math.random()>0.5)
var{a,b}={a:1,b:2}
其他的
var{a,b}={a:10,b:20}
//关于a和b的一些常见逻辑
控制台日志(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)

相关:我理解其中的区别,我现在只是想挑选编程头脑来解释为什么
var
不会永远保留通用用法。这可能是规范本身或当前实现的结果吗?@KamuelaFranco:显然是您所说的实现限制,似乎
let
为业务逻辑引入了更严格的环境。我的观点是,在开明的圈子里,它必须随着时间的推移逐步淘汰
var
的使用。使用
let
,可以直接更改属性,而不会导致错误,如
result={a:'foo',b:'bar'};结果.a=poof