3.1 说了下函数作用域是怎么个作用法
3.2 说函数作用域可以隐藏内部实现,不让外界知道。
①关于变量冲突,第三方模块常使用的办法是,用一个名字独特对象作为自己的命名空间,方法啊啥的都作为这个对象的属性,这样就不容易在全局作用域中引发冲突了。
②用模块管理工具也可避免全局作用域的变量冲突
3.3 对全局作用域不造成任何污染的办法:
①括号把函数声明包起来。然后加上立即调用。这样它又被执行又不污染作用域。括号内容会被当做一个函数表达式,而不是标准的函数声明。
②这种写法还可以加上参数,有两个用途:一是可以给参数换个名,使它在函数内有个更语义化的名字;二是可以用于判断全局作用域中的undefined标识符有没有被覆盖成别的值,是不是还是原来那个undefined。
3.4 说了块作用域怎么怎么地好
但是JavaScript中只有with和try-catch有块作用域。
ES6的let可以使变量绑在块作用域上。
块作用域的一个好处是:闭包(在某个作用域内声明的函数)的存在会使JavaScript引擎保留着作用域内的变量(具体情况取决于引擎的实现),这可能导致内存泄漏。
但如果作用域内一些变量的声明和使用是被放在一个块作用域中的,由于裹在块作用域中的变量并不暴露给那个闭包函数(因为闭包函数写在块作用域外),所以这些变量就不会老留在内存里造成内存泄漏。
for循环头部里的let i
不仅将i绑定进了for循环,而且每次迭代都会重新绑定。然而这章并没仔细说“每次迭代重新绑定”的细节。
附录B
let声明:
let (a = 0) {
}
这样做会创建一个显示作用域,更利于阅读和重构。
emmm但这种写法并不是es6规范里定义的,想这么写的话就得用代码转换工具,写成这种明显的样子,然后转换工具把它转成js引擎能懂的样子。