var
- var 有变量提升机制
console.log{abc};//undefined
var abc = 1;
可以访问到 变量 abc,但是因为在变量未初始化之前进行了访问,所以只能拿到 undefined;
- var 在声明全局作用域时,会自动创建一个全局对象属性,也就是 window 的对象,所以使用 var 进行声明时, 如果存在相同的变量属性,那么后者会覆盖前者。
for(var i=0;i<10;i++){
var a = i;
}
console.log(a);//9
变量 a 被重复赋值,且在循环外部也可以拿到。
let
为了弥补 var 的缺陷,在ES6 中引入了块级声明(let 和 const),块级声明让所声明的变量在指定块级作用域外,无法被访问,让变量的生命周期更加可控。
for(let i=0;i<10;i++){
let a = i;
}
console.log(a);// Uncaught ReferenceError: a is not defined
同时 let 声明的变量也不能重复赋值,否则会报错。
let age = 20;
let age = 21;//Uncaught SyntaxError: Identifier 'age' has already been declared
let 在全局作用域中,不会在全局 window 对象上创建一个属性。
var a = 10;
console.log(window.a === a);//true
let b = 20;
console.log(window.b === b);//false
const
const 继承了 let 的特点,但通过 const 声明的变量为基础数据类型时,它是不可变的,当它声明的变量为引用类型时,可以修改它的属性,如果要确保引用类型值的属性值不可变,要使用 Object.freeze() 冻结。
let a = '10';
a = '20';
console.log(a);//20
// const b = '20';
// b = '30';
// console.log(b);//报错
const dog = {
name:'旺财'
}
dog.name = '二哈';
console.log(dog.name)//二哈
本文深入探讨JavaScript中var、let和const关键字的区别,包括变量提升、块级作用域、重复声明的问题,以及它们如何影响变量的生命周期和全局对象。
1198

被折叠的 条评论
为什么被折叠?



