Page 39 - 你不知道的JavaScript(上卷)
P. 39

有很多原因促成了这种基于作用域的隐藏方法。它们大都是从最小特权原则中引申出来
               的,也叫最小授权或最小暴露原则。这个原则是指在软件设计中,应该最小限度地暴露必
               要内容,而将其他内容都“隐藏”起来,比如某个模块或对象的 API 设计。

               这个原则可以延伸到如何选择作用域来包含变量和函数。如果所有变量和函数都在全局作
               用域中,当然可以在所有的内部嵌套作用域中访问到它们。但这样会破坏前面提到的最小
               特权原则,因为可能会暴漏过多的变量或函数,而这些变量或函数本应该是私有的,正确
               的代码应该是可以阻止对这些变量或函数进行访问的。
               例如:

                   function doSomething(a) {
                       b = a + doSomethingElse( a * 2 );

                       console.log( b * 3 );
                   }

                   function doSomethingElse(a) {
                       return a - 1;
                   }

                   var b;

                   doSomething( 2 ); // 15

               在这个代码片段中,变量 b 和函数 doSomethingElse(..) 应该是 doSomething(..) 内部具体
               实现的“私有”内容。给予外部作用域对 b 和 doSomethingElse(..) 的“访问权限”不仅
               没有必要,而且可能是“危险”的,因为它们可能被有意或无意地以非预期的方式使用,
               从而导致超出了 doSomething(..) 的适用条件。更“合理”的设计会将这些私有的具体内
               容隐藏在 doSomething(..) 内部,例如:
                   function doSomething(a) {
                       function doSomethingElse(a) {
                           return a - 1;
                       }

                       var b;

                       b = a + doSomethingElse( a * 2 );

                       console.log( b * 3 );
                   }

                   doSomething( 2 ); // 15

               现在,b 和 doSomethingElse(..) 都无法从外部被访问,而只能被 doSomething(..) 所控制。
               功能性和最终效果都没有受影响,但是设计上将具体内容私有化了,设计良好的软件都会
               依此进行实现。


               24   |   第 3 章
   34   35   36   37   38   39   40   41   42   43   44