块级函数(Block-Level Functions)浏览器
在ES3及之前,在块内声明一个函数会报语法错误,可是全部的浏览器都支持块级函数。不幸的是,每一个浏览器在支持块级函数方面都有一些细微的不一样的行为。因此开发者最好不要在块内声明函数。为了解决浏览器在块内支持声明函数时带来的兼容性问题,在ES5中能够使用strict模式,这样若是开发者试图定义一个块内函数,就会报错:函数
"use strict"; if (true) { //throws a syntax error in ES5 function soSomething() { //... } }
在ES6中,上面的doSomething函数是一个块级函数,而且能够在同一块内调用:spa
"use strict"; if (true) { console.log(typeof doSomething); // "function" function doSomething() { //... } doSomething(); } console.log(typeof doSomething); // "undefined"
上面的代码中,doSomething被提高到块顶部,在块外不能被访问到。code
决定什么时候使用块级函数(Deciding When to Use Block-Level Functions)blog
块级函数与let函数表达式类似,当代码执行出块后,函数的定义就被移除了。二者的区别是块级函数会被提高到块的顶部,而let函数表达式则不会。参见下面的例子:ci
"use strict"; if (true) { console.log(typeof doSomething); // "error" let doSomething = function() { //... } doSomething(); } console.log(typeof doSomething); // "undefined"
ES6中也能够在non-strict模式下定义块级函数,可是跟在strict模式下会有不一样。块级函数会被提高到整个函数顶部或者全局环境中:作用域
if (true) { console.log(typeof doSomething); // "function" let doSomething = function() { //... } doSomething(); } console.log(typeof doSomething); // "function"
在这个例子中,doSomething函数会被提高到全局做用域中,所以上面两处都会输出function。开发