@@ -306,7 +306,7 @@ ES6允许块级作用域的任意嵌套。
306306
307307函数能不能在块级作用域之中声明,是一个相当令人混淆的问题。
308308
309- ES5规定 ,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。
309+ ES5 规定 ,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。
310310
311311``` javascript
312312// 情况一
@@ -318,10 +318,11 @@ if (true) {
318318try {
319319 function f () {}
320320} catch (e) {
321+ // ...
321322}
322323```
323324
324- 上面代码的两种函数声明,根据ES5的规定都是非法的 。
325+ 上面两种函数声明,根据 ES5 的规定都是非法的 。
325326
326327但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数,因此上面两种情况实际都能运行,不会报错。不过,“严格模式”下还是会报错。
327328
@@ -337,12 +338,10 @@ if (true) {
337338ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。
338339
339340``` javascript
340- // ES6严格模式
341- ' use strict' ;
341+ // ES6
342342if (true ) {
343- function f () {}
343+ function f () {} // 不报错
344344}
345- // 不报错
346345```
347346
348347ES6 规定,块级作用域之中,函数声明语句的行为类似于` let ` ,在块级作用域之外不可引用。
@@ -362,7 +361,7 @@ function f() { console.log('I am outside!'); }
362361上面代码在 ES5 中运行,会得到“I am inside!”,因为在` if ` 内声明的函数` f ` 会被提升到函数头部,实际运行的代码如下。
363362
364363``` javascript
365- // ES5版本
364+ // ES5 版本
366365function f () { console .log (' I am outside!' ); }
367366(function () {
368367 function f () { console .log (' I am inside!' ); }
@@ -375,7 +374,7 @@ function f() { console.log('I am outside!'); }
375374ES6 的运行结果就完全不一样了,会得到“I am outside!”。因为块级作用域内声明的函数类似于` let ` ,对作用域之外没有影响,实际运行的代码如下。
376375
377376``` javascript
378- // ES6版本
377+ // ES6 版本
379378function f () { console .log (' I am outside!' ); }
380379(function () {
381380 f ();
@@ -388,12 +387,12 @@ function f() { console.log('I am outside!'); }
388387- 函数声明类似于` var ` ,即会提升到全局作用域或函数作用域的头部。
389388- 同时,函数声明还会提升到所在的块级作用域的头部。
390389
391- 注意,上面三条规则只对ES6的浏览器实现有效 ,其他环境的实现不用遵守,还是将块级作用域的函数声明当作` let ` 处理。
390+ 注意,上面三条规则只对 ES6 的浏览器实现有效 ,其他环境的实现不用遵守,还是将块级作用域的函数声明当作` let ` 处理。
392391
393- 前面那段代码,在 Chrome 环境下运行会报错 。
392+ 根据这三条规则,在浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于 ` var ` 声明的变量 。
394393
395394``` javascript
396- // ES6的浏览器环境
395+ // 浏览器的 ES6 环境
397396function f () { console .log (' I am outside!' ); }
398397(function () {
399398 if (false ) {
@@ -406,10 +405,10 @@ function f() { console.log('I am outside!'); }
406405// Uncaught TypeError: f is not a function
407406```
408407
409- 上面的代码报错,是因为实际运行的是下面的代码 。
408+ 上面的代码在符合 ES6 的浏览器中,都会报错,因为实际运行的是下面的代码 。
410409
411410``` javascript
412- // ES6的浏览器环境
411+ // 浏览器的 ES6 环境
413412function f () { console .log (' I am outside!' ); }
414413(function () {
415414 var f = undefined ;
@@ -442,7 +441,7 @@ function f() { console.log('I am outside!'); }
442441}
443442```
444443
445- 另外,还有一个需要注意的地方。ES6的块级作用域允许声明函数的规则 ,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
444+ 另外,还有一个需要注意的地方。ES6 的块级作用域允许声明函数的规则 ,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
446445
447446``` javascript
448447// 不报错
0 commit comments