ES5只有全局作用域和函数作用域
为什么要有块级作用域
-
防止内层变量覆盖外层变量
var tmp=new Date();
function f(){
console.log(tmp);
if(false){
var tmp='hello world'
}
}
f()// undefined 没有块级作用域,然后通过var声明变量导致变量提升,覆盖了外层变量
-
防止循环变量泄露为全局变量
都知道for循环var i=0
相当于在全局变量定义i=0,在循环结束后,并未消失,泄露在全局变量中。
ES6的块级作用域
let实际上为JS新增了块级作用域
function f(){
let n=5;
if true(){let n=6}
console.log(n) //5
}
es6允许块级作用域任意嵌套
{
{
{
let x=2;
}
console.log(x) //报错
}
}
块级作用域使得立即执行匿名函数(IIFE)不再必要
你只需要在想执行的地方:
{
let x=....
xxxxx
}
块级作用域与函数声明:
由于现在环境不同,不建议在块级作用域中声明函数,若确实需要请用表达式
- 允许块级作用域内声明函数
- 规定是在块级作用域中,函数声明的语句类似let,块级作用域之外不可引用,但为了兼顾ES5,目前函数声明类似var
- 函数声明会提升到全局作用域/函数作用域头部,同时也会提升到所在块级作用域头部
do表达式:块级作用域本无返回值,但是加一个do,使其变为do表达式,便可以得到返回值:
let x={
let t=f();
t*t+1;
}
网友评论