块级作用域
- ES5 只有全局作用域和函数作用域,没有块级作用域 ,es6新增
- 块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(自调用函数
(function(){}())
)不再必要了 - 允许在块级作用域内声明函数。
- 函数声明类似于
var
,即会提升到全局作用域或函数作用域的头部。 - 函数声明还会提升到所在的块级作用域的头部
- 块级作用域内声明的函数,行为类似于
var
声明的变量 (会影响外部作用域的函数) - 避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式(var yehui = function),而不是函数声明语句(function yehui(){})
- ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错
//if里面的变量提升,导致内层的tmp变量覆盖了外层的tmp变量,console是在赋值前执行,导致输出undefined
//不管判断语句是否执行,在预解析的时候都会提前变量的声明
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f(); // undefined
------------------------------------------------------------------
//变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
------------------------------------------------------------------
//在块级作用域内声明函数相当于var一个变量,会提升声明和作用域
//如果把判断语句删除,会输出I am outside!
function f() { console.log('I am outside!'); }
(function () {
//相当于var f = undefined;
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();// Uncaught TypeError: f is not a function
}());
根据袁一峰的ECMAScript6和自身理解翻译,要是有补充或者说错的地方可以在下面留言谢谢