块级作用域
在ES5中,只有全局作用域和函数作用域。
影响:
- if内层变量可能覆盖外层变量
- for循环的变量会泄露成全局变量
使用var
var a = 1;
if(1) {
var a = 3;
}
console.log(a); //打印3,被if中的声明覆盖
使用let
let a = 1;
if(1) {
let a = 3;
}
console.log(a); //打印1,if函数中的变量a只在这个块中有效
ES6中引入let和const命名后有了块级作用域
在{ }内部的区域为块级作用域
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
示例代码:
// 外层作用域无法获取到内层作用域
function fn1() {
let a = 1;
if(1) {
let a = 2;
console.log(a); //打印2
}
console.log(a); //打印1
}
fn1();
// 外层和内层相同变量名互不干扰
{
{
let food = 'apple';
console.log(food); //apple
{
let food = 'orange';
console.log(food); //orange
}
块级作用域和和函数声明
在ES5中,函数只能在顶级作用域和函数作用域中声明,不能在块级作用域中声明。但是在ES6中,函数可以在块级作用域中声明。
//fn1(); //在块外的上方加入,则会报错,因为变量提升只会到块作用域的最上方,此时fn1还未定义
if(1) {
fn1(); //打印1
function fn1(){
console.log(1)
}
}
fn1(); //打印1,function函数声明 全局使用

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



