块级作用域和函数
ES5和ES6中对于函数中块级作用域的区别
ES5:函数只能在
顶级作用域
和函数作用域
中声明,不能在块级作用域
中声明// 非法声明情况一 if (true) { function f() {} } // 非法声明情况二 try { function f() {} } catch(e) { // ... }
提示:块级作用域;
ES6:允许在块级作用域中声明函数,但函数声明的行为类似于
let
,块级作用域之外不可以使用ES5 vs ES6
注意在ES6浏览器中有特殊:
- 允许在块级作用域内声明函数。
- 函数声明类似于
var
,即会提升到全局作用域或函数作用域的头部。 - 同时,函数声明还会提升到所在的块级作用域的头部。
// ES5 环境 function f() { console.log('I am outside!'); } (function () { function f() { console.log('I am inside!'); }//函数作用域中声明 if (false) { } f(); }());
ES5中:得到
I am inside!
//ES6 环境 function f() { console.log('I am outside!'); } (function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); //此时f在代码块内,相当于let声明外部不可以使用 } } f(); }());
ES6中:报错;因为ES6中声明类似于var声明,实际是在整个开头将函数f生命诚一个变量f;此时f并不是一个函数因此会报错为
VM6105:10 Uncaught TypeError: f is not a function
尽量避免块级作用域中声明函数:
- 避免会计作用域内声明函数,如必须最好写成函数表达式形式
var a = function(){}
而不是函数声明语句 - ES6块级作用域必须有大括号,否则就认为不存在块级作用域
// 第一种写法,报错 if (true) let x = 1; // 第二种写法,不报错 if (true) { let x = 1; }
严格模式下,函数也只能声明在当前作用域的顶层
// 不报错 'use strict'; if (true) { function f() {} } // 报错 'use strict'; if (true) function f() {}
- 避免会计作用域内声明函数,如必须最好写成函数表达式形式