一、var
1、使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升的现象。
var a = 1; //此处声明的变量a为全局变量
function fn() {
var a = 2; //此处声明的变量a为函数fn的局部变量
console.log(a); //2
}
fn();
console.log(a); //1
2、var存在变量提升
var a = 1; //此处声明的变量a为全局变量
function fn() {
console.log(a); //undefined
var a = 2; //此处存在变量提升
}
fn();
console.log(a); //1
二、let
1、使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
function aa() {
console.log(name); //undefined
console.log(age); //报错
var name = "aaa"; //var存在变量提升
let age = 21; //let没有变量提升
}
aa();
经典面试题(var和let)
let arr=[]
for(let i =0;i<2;i++){
arr[i]=function(){
console.log(i);
}
}
arr[0]();
arr[1]();
//结果为0,1
var arr = []
for (var i = 0; i < 2; i++) {
arr[i] = function() {
console.log(i);
}
}
arr[0]();
arr[1]();
//结果为2,2
三、const
1、使用const声明的常量,在后面出现的代码中不能再修改该常量的值。(复杂数据类型,内部的值可以修改)
const arr = [100, 200];
arr[0] = 300;
arr[1] = 400;
console.log(arr); //输入结果为[300,400]
arr = [300, 400] //报错
四、总结
声明变量 | 作用域 | 变量提升 | 值更改 |
var | 函数级 | 可以 | 可以 |
let | 块级(存在暂时性死区) | 不存在 | 可以 |
const | 块级(存在暂时性死区) | 不存在 | 不可 |
经典面试题
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 100)
};
//结果为:10个10
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 100)
};
//结果为:0-9