这些var声明是样式还是功能问题?

时间:2017-03-08 18:31:57

标签: javascript

ES5,最广泛使用的JavaScript实现,目前没有块范围,所以最好的做法是将你的惯用变量声明放在for语句中还是在for语句之外?

选项-1

for(var i = 0, l = arr.length; i < l; i++ ){
    sum += arr[i];
}

选项-2

var i; 
var l = arr.length;
for(i = 0; i < l; i++ ){
    sum += arr[i];
}

这只是一种风格偏好还是有最好的做法?

1 个答案:

答案 0 :(得分:1)

使用var,这是一个样式问题。

但是从ES2015(又名&#34; ES6&#34;)开始,如果你使用letconst,JavaScript会获得变量的块范围。所以

for (let i = 0, l = arr.length; i < l; i++ ){
    sum += arr[i];
}

VS。

let i; 
let l = arr.length;
for(i = 0; i < l; i++ ){
    sum += arr[i];
}

纯粹是一种风格问题。有两件事需要考虑:

  1. 第一个,当然,il的范围是for循环(虽然可能不是你想象的那样),而第二个是&# 39;在包含for循环的范围内。

  2. 对于第一个,每次循环迭代(确实)都有一个 new il,这会对性能产生影响;对于第二个,所有循环迭代(以及包含范围)只共享一个il

  3. #2对您在循环中创建的任何函数产生重大影响,正如您在此示例中所看到的那样:

    &#13;
    &#13;
    for (let i = 0; i < 3; ++i) {
      setTimeout(() => {
        console.log("let inside the loop, i = " + i);
      }, 0);
    }
    
    let j;
    for (j = 0; j < 3; ++j) {
      setTimeout(() => {
        console.log("let outside the loop, j = " + j);
      }, 0);
    }
    &#13;
    &#13;
    &#13;

    在兼容ES2015的浏览器上输出:

    let inside the loop, i = 0
    let inside the loop, i = 1
    let inside the loop, i = 2
    let outside the loop, j = 3
    let outside the loop, j = 3
    let outside the loop, j = 3
    

    注意i的值02的值,但j的值始终是3(就像var一样i 1}})。这是因为每次循环迭代都有不同的 j变量,但是所有循环迭代只共享一个let变量。

    注意: IE9-IE11有3,但符合ES2015标准。如果您在其中运行上述内容,则会i以及j看到notes = {'ban': 'BAN: is the account number, Other relative information, More information'}