JS中var、let、const关键字

var与let

相同点: 声明变量,被声明的变量的值可以被修改。如果声明时没有被赋值,默认值为undefined。
不同点: 变量作用域不同。var 声明的变量具有全局性而且有提前声明的效果。let关键字具有块级作用域就是在大括号有用,出了这个块级作用域就销毁了。

if (true) {
	var uname = "李雷"; //用var声明变量
    company = "娃哈哈";//没有用var声明,那么他会先找当前作用域是否有申明,然后再向外不去寻找。会提前声明
    let sex = "男";// 用let关键字声明变量
    console.log(sex); //男
}
console.log(uname);//李雷
console.log(company);//娃哈哈
console.log(sex);//报错: Uncaught ReferenceError: sex is not defined  因为sex是用let关键字声明的,所以作用域只在大括号内,出了大括号就销毁了,所以会报错。

易错点(面试技巧)
仔细观察下面两段代码

//代码一
var arr = []; //声明空数组
for (var i = 0; i < 2; i++) {
	arr[i] = function() { //向数组中添加元素(这里的元素是一个方法)
    	console.log(i);
    }
}
arr[0](); //结果 :2
arr[1](); //结果 :2
//代码二
var arr = []; //声明空数组
for (let i = 0; i < 2; i++) {
	arr[i] = function() { //向数组中添加元素(这里的元素是一个方法)
    	console.log(i);
    }
}
arr[0](); //结果 :0
arr[1](); //结果 :1

上方两段代码唯一不同点就是 for 循环中的变量 i 一个使用 var 另一个是用 let ,然而结果却是大不相同。
解析:

  • 代码一:由于var关键字命名的变量具有全局作用域的效果,当循环结束后 i 的值为2。数组中的元素需要打印当前 i 的值,索引就打印除了现在全局存在的i的当前值2.
  • 代码二:由于let关键字命名的变量具有块级作用域的效果。第一次循环i的值为0,添加到数组中,当循环结束后 i 出了这一次的块级作用域就被销毁了。进入第二次循环时,又创建了一个块级作用域,同理第二次也是一样。每次循环都会创建一个块级作用域。i 就保持了当前作用域的值。所以最后的结果为 0,1

const与let

相同点: 作用域都是块级作用域
不同点: const声明时必须赋初始值,并且赋值过后就不能修改了。

发布了13 篇原创文章 · 获赞 12 · 访问量 901

猜你喜欢

转载自blog.csdn.net/qq_33463449/article/details/104021706
今日推荐