转前端 vue.js 学习笔记-1.2-使用 let 与 const 定义常量变量
定义变量常量
let
let 定义常量
const
const 定义变量
为什么不使用var
最简单的答案就是let提供块作用域(block-scoping),这会比var提供的以函数为作用域有更加精细化的控制。
如下一个例子:
问题: 在下面的例子中,请说出控制台的打印结果。
var callbacks = [];
(function() {
for (var i = 0; i < 5; i++) {
callbacks.push( function() { return i; } );
}
})();
console.log(callbacks.map( function(cb) { return cb(); } ));
我们将for循环执行五次,每次将一个函数push到callbacks
数组中。最后callbacks
数组里面的每一个函数的执行结果打印出来。
一个新手工程师经过深思熟虑可能会回答[0, 1 , 2, 3, 4]
, 然而却掉入了JavaScript
的”hoisting陷阱”。
只有当你理解了hoisting, 才能给出正确的答案[5, 5, 5, 5, 5]
。
var callbacks = [];
(function() {
var i;
for (i = 0; i < 5; i++) {
callbacks.push( function() { return i; } );
}
})();
console.log(callbacks.map( function(cb) { return cb(); } ));
注意上面的代码,JavaScript
将变量提升到函数定义的顶部,经过整个for
循环,callbacks
里面存储的5个函数指向的同一个变量i
的值已经是5。所以最终打印出来的值都为5。
在以前要通过各种奇淫技巧来解决这个问题,并成功返回[0, 1, 2, 3, 4]
, 现在我们有了let
,就可以很简单解决问题:
var callbacks = [];
(function() {
for (let i = 0; i < 5; i++) {
callbacks.push( function() { return i; } );
}
})();
console.log(callbacks.map( function(cb) { return cb(); } ));
因为let
拥有块作用域,所以使用let
声明的变量i
不会被提升到函数顶部,i
的作用域在for
循环, 就会每次循环有独立的值。
那我们是不是应该不要使用var
了呢?如果你想要一个变量拥有函数作用域,var
还是很有用的。
本作品采用《CC 协议》,转载必须注明作者和本文链接