ES5中没有块作用域,有时候需要“隐藏”变量和函数,有很多原因促成了这种基于作用域的隐藏方法。 它们大都是从最小特权原则中引申出来的, 也叫最小授权或最小暴露原则。 这个原则是指在软件设计中, 应该最小限度地暴露必
要内容, 而将其他内容都“隐藏” 起来, 比如某个模块或对象的 API 设计。
“隐藏” 作用域中的变量和函数所带来的另一个好处, 是可以避免同名标识符之间的冲突,
两个标识符可能具有相同的名字但用途却不一样, 无意间可能造成命名冲突。 冲突会导致
变量的值被意外覆盖。
变量冲突的一个典型例子存在于全局作用域中。 当程序中加载了多个第三方库时, 如果它
们没有妥善地将内部私有的函数或变量隐藏起来, 就会很容易引发冲突。
这些库通常会在全局作用域中声明一个名字足够独特的变量, 通常是一个对象。 这个对象
被用作库的命名空间, 所有需要暴露给外界的功能都会成为这个对象( 命名空间) 的属
性, 而不是将自己的标识符暴漏在顶级的词法作用域中。
另一种避免冲突的方法是模块管理:另外一种避免冲突的办法和现代的模块机制很接近, 就是从众多模块管理器中挑选一个来使用。 使用这些工具, 任何库都无需将标识符加入到全局作用域中, 而是通过依赖管理器的机制将库的标识符显式地导入到另外一个特定的作用域中。
目前还没有用到
为了避免函数污染作用域可以使用立即执行表达式(IIFE)
var a = 2; (function IIFE( global ) { var a = 3; console.log( a ); // 3 console.log( global.a ); // 2 })( window ); console.log( a ); // 2
我们将 window 对象的引用传递进去, 但将参数命名为 global, 因此在代码风格上对全局
对象的引用变得比引用一个没有“全局” 字样的变量更加清晰。 当然可以从外部作用域传
递任何你需要的东西, 并将变量命名为任何你觉得合适的名字。 这对于改进代码风格是非
常有帮助的。
是一个用来对之前的最小授权原则进行扩展的工具, 将代码从在函数中隐藏信息
扩展为在块中隐藏信息。
try/catch
非常少有人会注意到 JavaScript 的 ES3 规范中规定 try/catch 的 catch 分句会创建一个块作
用域, 其中声明的变量仅在 catch 内部有效。
今日let关键字未看完,明日继续!
Page 22 ~ Page 33 2021.04.09 21:42