美文网首页
let 与 var

let 与 var

作者: Gettingjie | 来源:发表于2018-08-02 10:58 被阅读0次

  ECMAScript 6 中新增了 let 命令来声明变量,它的用法类似于 var,但是 let 所声明的变量,只在 let 命令所在的代码块内有效。而 var 声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问。这就会导致一些问题--如声明相同的变量名来进行多层 for 循环会导致前面的变量被后面的同名变量覆盖。

let matrix = [[1, 2, 3],
              [2, 3, 4],
              [3, 4, 5],
              [4, 5 ,6]];

function sumMatrix(matrix) {
    var sum = 0;
    for (var i = 0; i < matrix.length; i++) {
        var currentRow = matrix[i];
        console.log('currentRow = '+currentRow);
        for (var i = 0; i < currentRow.length; i++) {
            sum += currentRow[i];
            console.log('currentRow['+i+'] = '+currentRow[i]);
            console.log('sum = '+sum);
        }
    }

    return sum;
}

function sumMatrix2(matrix) {
    let sum = 0;
    for (let i = 0; i < matrix.length; i++) {
        let currentRow = matrix[i];
        console.log('currentRow = '+currentRow);
        for (let i = 0; i < currentRow.length; i++) {
            sum += currentRow[i];
            console.log('currentRow['+i+'] = '+currentRow[i]);
            console.log('sum = '+sum);
        }
    }

    return sum;
}

sumMatrix(matrix)  //6;
sumMatrix2(matrix)  //42;

  let 形式的多层循环中内层作用域变量会屏蔽(Shadowing)外层作用域中的同名变量(ES6块级作用域),使运行结果正确,而 var 形式的多层循环会导致控制第二层循环的变量覆盖掉控制第一层循环的变量,使其超过循环的限制次数而直接退出。

let matrix = [[1, 2, 3],
              [2, 3, 4],
              [3, 4, 5],
              [4, 5 ,6],
              [5, 6 ,7],
              [6, 7 ,8]];

function sumMatrix(matrix) {
    var sum = 0;
    for (var i = 0; i < matrix.length; i++) {
        var currentRow = matrix[i];
        console.log('currentRow = '+currentRow);
        for (var i = 0; i < currentRow.length; i++) {
            sum += currentRow[i];
            console.log('currentRow['+i+'] = '+currentRow[i]);
            console.log('sum = '+sum);
        }
        console.log('i = ' + i);
    }
    return sum;
}

function sumMatrix2(matrix) {
    let sum = 0;
    for (let i = 0; i < matrix.length; i++) {
        let currentRow = matrix[i];
        console.log('currentRow = '+currentRow);
        for (let i = 0; i < currentRow.length; i++) {
            sum += currentRow[i];
            console.log('currentRow['+i+'] = '+currentRow[i]);
            console.log('sum = '+sum);
        }
    }

    return sum;
}

sumMatrix(matrix)  loop;
sumMatrix2(matrix)  //81;

  let 形式的多层循环会得到正确的结果,而 var 形式的多层循环会导致控制第二层循环的变量覆盖掉控制第一层循环的变量,其在第二层循环后 i == 3 使得再次进入第一层循环后从第四项继续开始进入第二层循环后 i 被重新设置为 0 进行第二层循环,第二层循环结束后 i == 3,返回第一层循环继续执行......
  

相关文章

  • 第二章 let 和 const 命令

    // let 与 var /* 一 */ { let a =12; var b =10; } //...

  • ES6-let & const

    一. let与var let 是块级作用域;var 是函数级作用域。 二. let 与 const let与con...

  • 关于ES6的let命令

    1、let的基本用法以及let和var的区别 (1) let与var一样是用来声明变量的,与var的区别是let所...

  • ES6_var、let与const

    var,let 与 const var 申明变量。 let 申明变量,更完美的 var。 const 申明常量(物...

  • let 与 var

      ECMAScript 6 中新增了 let 命令来声明变量,它的用法类似于 var,但是 let 所声明的变量...

  • var与let

    1、var定义变量 1.1 不指定类型定义变量 //定义变量(不指定类型变量),使用var关键字var x = 1...

  • var与let?

    首先我们来看一道面试题 通常,你以为这不就是一个for循环吗?结果肯定是123456了,但是却发现答案是55555...

  • var 与let

    1.声明提升 使用var 声明变量,声明会提升到顶部 使用let 声明变量不会提前 在函数内部用var声明变量,只...

  • 20190301 es6学习—let和const命令

    let命令 let与var之间的不同 声明变量的作用域 作用:声明变量 类似var与var的区别:var声明的变量...

  • ES6之let/const/var

    let与var let声明的变量有严格局部作用域,var会越域 let只能声明一次变量,var可以多次声明 let...

网友评论

      本文标题:let 与 var

      本文链接:https://www.haomeiwen.com/subject/ptmrvftx.html