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
,返回第一层循环继续执行......
网友评论