ECMAScript6学习笔记——块级作用域
2017-04-03 22:20
399 查看
ES5没有块级作用域的弊端:
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。例如:var s = 'hello'; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
上面代码中,变量
i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
let
实际上为 JavaScript 新增了块级作用域。
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。// IIFE 写法 (function () { var tmp = ...; ... }()); // 块级作用域写法 { let tmp = ...; ... }
块级作用域与函数声明
ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于
let,在块级作用域之外不可引用。
在浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于
var声明的变量。其他环境的实现不用遵守,还是将块级作用域的函数声明当作
let处理。
// 浏览器的 ES6 环境 function f() { console.log('I am outside!'); } (function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); } } f(); }()); // Uncaught TypeError: f is not a function
因为类似于var声明的变量,所以会var f = undefined;提升到声明函数f的前边(变量提升)。
如果确实需要在块级作用域内声明函数,也应该写成函数表达式,而不是函数声明语句。
// 函数声明语句 { let a = 'secret'; function f() { return a; } } // 函数表达式 { let a = 'secret'; let f = function () { return a; }; }
ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
do 表达式
使得块级作用域可以变为表达式,也就是说可以返回值let x = do { let t = f(); t * t + 1; };
变量
x会得到整个块级作用域的返回值。
相关文章推荐
- 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用
- you don't know js -- Scope and Closures学习笔记——第二章(词法作用域)
- 算法导论<学习笔记> 第一章 算法在计算中的作用
- you don't know js -- Scope and Closures学习笔记——第三章(函数VS块作用域)
- 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用
- 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
- ECMAScript6学习笔记——let和const命令
- ECMAScript6(ECMAScript2015)学习笔记
- [置顶] 《JavaScript高级程序设计》学习笔记(四)变量、作用域和内存问题
- 《javascript高级程序设计》学习笔记——javascript基础之变量,作用域和内存问题
- [置顶] 《JavaScript高级程序设计》学习笔记(四)变量、作用域和内存问题
- ECMAScript6学习笔记——promise对象
- Angular中$scope类的简介及作用——(学习笔记①)
- STM32固件库中assert_param的作用——学习笔记
- 学习笔记 C++ const放在函数体前和函数参数列表之后的作用
- <算法导论>学习笔记(1)--第1章 算法在计算中的作用
- 学习笔记之20-static和extern关键字2-对变量的作用
- 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用
- ECMAScript6学习笔记《一》-----ECMAScript 6是什么?
- ECMAScript6学习笔记——generator函数