查找了资料和参考了一些大神的总结,我也总结一下记个笔记。
1.var
var相比let就是管的比较宽,他的值可以被内部修改。
function tests(){
var n = 1;
if (true) {
var n = 2;
}
console.log(n); //值被函数内部修改,输出2
}
tests();
if(1){
var a = 100;
}
console.log( a );//输出100,因为var没有块级作用域,这里a会成为全局变量
2.let
let是es6中新增定义,带有块级作用域,只会在所定义块生效。
function test(){
let n = 1;
if (true) {
let n = 2;
}
console.log(n); //值不会被修改,输出1
}
test();
if(1){
let b = 100;
}
console.log( b );//错误 ReferenceError: b is not defined
//因为let的块级作用域,所以b变量只存在与if内部
let 和 const 存在“变量死区”,这点也是和 var 不同的地方。
3.const
const用来定义常量(可以是字符串,数组,函数,对象等),并且初始值不可为空,但他并不是不可更改的。举个栗子:
const c;//会产生报错.
const d = 1;//正确
const arr = [1, 2];
arr.push(1);//正确 [1, 2, 1]
arr[0] = 3;//正确 [3, 2, 1]
arr = [];//错误TypeError: invalid assignment to const `arr'
可见,如果有需要,可以改变const里所存储的值,但它的指向空间是无法操作的。
4.有趣的面试例子
面试的时候很经常遇到一个例子:
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
//这个例子执行完输出什么结果?
//答案是 5,5,5,5,5
//如果想要输出0,1,2,3,4改怎么实现?
//其中一种方案就是把var换成let就可以了。let的块级作用域在这里就体现出来了。
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
--------------------------------------------------------------笔记结束了!!!
网友评论