Page 64 - 你不知道的JavaScript(下卷)
P. 64

因此,应该将函数值视为一个表达式,与其他的值或者表达式类似。

                 考虑:

                     var foo = function() {
                         // ..
                     };

                     var x = function bar(){
                         // ..
                     };

                 第一个赋给变量 foo 的函数表达式被称为是匿名的,因为这个函数表达式没有名称。

                 第二个函数表达式是已命名的(bar),即使它的引用赋值给了变量 x。虽然匿名函数表达
                 式的使用仍然极为广泛,但通常更需要已命名函数表达式。
                 要想获取更多信息,参见本系列中的《你不知道的 JavaScript(上卷)》第一部分。


                 2.5.1 立即调用函数表达式

                 在前面的代码片段中,两个函数表达式都没有运行——如果加上 foo() 或者 x(),那么就
                 可以执行了。

                 还有另一种方法可以执行函数表达式,这种方法通常被称为立即调用函数表达式
                (immediately invoked function expression,IIFE):
                     (function IIFE(){
                         console.log( "Hello!" );
                     })();
                     // "Hello!"

                 (function IIFE(){ .. }) 函数表达式外面的 ( .. ) 就是 JavaScript 语法能够防止其成为普
                 通函数声明的部分。

                 表达式最后的 ()(即 })(); 这一行)实际上就表示立即执行前面给出的函数表达式。
                 这看起来可能有点奇怪,但实际上并不像初看上去那么诡异。思考 foo 和这里的 IIFE 的类
                 似之处:

                     function foo() { .. }

                     // foo函数引用表达式,然后()执行它
                     foo();

                     // IIFE函数表达式,然后()执行它
                     (function IIFE(){ .. })();



                                                                         深入 JavaScript   |   41

                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   59   60   61   62   63   64   65   66   67   68   69