块级作用域
es5语法规则中,只有全局作用域和函数作用域,不存在块级作用域(一个块级作用域即为一个{}内)。
这会导致很多场景不合理。
第一种场景,内层变量可能会覆盖外层变量。
function test4(){
var tmp =new Date();
function f () {
console.log(tmp); // undefined
if (false) {
var tmp = `hello world`;
}
}
f () ;
};
test4();
第二种场景,用来计数的循环变量泄露为全局变量。
var s = `hello`;
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
};
console.log(i); // 5
块级作用域的应用:实际上使得原来广泛应用的立即执行匿名函数(IIFE)不再必要。
// IIFE 写法
( function(){
var tmp = `hello dengjing!`;
// 该变量只在该匿名函数作用域内有效
}() );
// 块级作用域 写法
{
let tmp = `hello dengjing!`;
}
块级作用域与函数声明
function test9(){
function f(){ console.log(`I am outside!`) }
( function(){
if(false){
// 重复声明一次函数f
function f(){ console.log(`I am inside`); }
}
f();
}() )
}
test9();
上面代码,在ES5中运行结果:I am inside。因为被声明的函数会被提升到函数头部,实际运行代码如下:
function test9(){
function f(){ console.log(`I am outside!`) }
( function(){
function f(){ console.log(`I am inside`); }
if(false){
// 重复声明一次函数f
}
f();
}() )
}
test9()