Javascript变量作用域
1.let和var的区别
(1)能否用其定义同名变量
通过var定义变量,可以重复定义同名的变量,并且后定义的会覆盖先定义的;如果通过let定义变量, "相同作用域内"不可以重复定义同名的变量。
var num = 123;
var num = 321; // 不报错
console.log(num);
let num = 123;
let num = 321; // 报错
(2)是否能够先使用后定义-与预解析有关
通过var定义的变量, 可以先使用后定义(会预解析);
通过let定义的变量, 不可以先使用再定义(不会预解析-即不会提升对let的预解析)。
console.log(num); // 输出undefined
var num = 123;
/*
预解析后:
var num;
console.log(num);
num = 123;
*/
console.log(num); // 报错
let num = 123;
/*
预解析后:
console.log(num);
let num;
num = 123;
*/
(3)是否能被{}限制作用域
无论是var还是let定义在{}外面都是全局变量;
将var定义的变量放到一个单独的{}里面, 还是一个全局变量;
将let定义的变量放到一个单独的{}里面, 是一个局部变量。
{
var num = 123;
}
console.log(num); //不会报错
{
let num = 123;
}
console.log(num); //会报错
2.三种作用域
(1)在JavaScript中{}外面的作用域,:全局作用域
(2)在JavaScript中函数后面{}中的的作用域:“局部作用域”
(3)在ES6中只要{}没有和函数结合在一起:“块级作用域”
{
// 块级作用域
}
if(false){
// 块级作用域
}
while (false){
// 块级作用域
}
for(;;){
// 块级作用域
}
do{
// 块级作用域
}while (false);
switch () {
// 块级作用域
}
function say() {
// 局部作用域
}
3.块级作用域和局部作用域区别
在块级作用域中通过var定义的变量是全局变量;
在局部作用域中通过var定义的变量是局部变量
if(false){
// 块级作用域
var a=123; // 全局变量
}
console.log( a); // 不报错
function say(){
// 局部作用域
var b=234; // 局部变量
}
console.log(b); // 报错
4.省略var或let直定义接初始化
if(true){
// 块级作用域
a=123;
}
function test(){
// 局部作用域
b=234;
}
console.log(a); // 不报错
console.log(b); // 报错
test();
console.log(b); // 不报错