问题 ES6中var的用例是什么?


如果 let 关键字引入了块范围的正确实现,确实如此 var 再有一个用例?我从软件设计的角度看这个,而不是语法,“你能做到”的立场。


4511
2017-08-05 15:32


起源

有关: stackoverflow.com/questions/762011/... - Marvin
我理解其中的差异,我只是想为了原因选择编程大脑 var 不会永远留下常见用法。 - Kamuela Franco
可能重复 使用“let”和“var”来声明变量有什么区别? - James Donnelly


答案:


如果 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

8.1.1.4全球环境记录

物体 环境记录 全局环境记录的组件包含所有内置全局变量的绑定(第18条)以及由a引入的所有绑定 FunctionDeclarationGeneratorDeclaration, 要么 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 尚未初始化的变量。


11
2017-08-05 16:45



从你说的话来看,似乎就是这样 let 为业务逻辑引入了更严格的环境。我认为它必须逐步使用 var 在开明的圈子里随着时间推移。 - Kamuela Franco


let 不能在全球范围内使用 然而var 能够。

这是您在尝试全局时从Chrome获得的内容 let 在严格模式之外:

在严格模式之外尚不支持块范围的声明(let,const,function,class)


4
2017-08-05 15:36



这是规范本身或当前实现的结果吗? - Kamuela Franco
@KamuelaFranco:显然是一个实施限制 - Bergi


实际上我发现了一些用于自己的用例。

有时你可能想在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

有美容标准的人可能会认为不整洁,我自己更喜欢 lets,但如果我编辑的代码已经包含 vars - 使用它们很自然,使编码更容易。


1
2017-08-30 04:43





您可以使用 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)

0
2017-08-01 20:07