IIFE 立即调用的函数表达式

基本概念

jQuery 对象: 通过jQuery 选择器或者方法取得的元素集合。
$() 函数:为了新建一个 jQuery 对象,我们使用了 $() 函数,这个函数接受了 css 选择器作为它的参数,返回值作为一个 factory,这个 factory 就是指向页面对应元素的 jQuery 对象。
关于美元符 $:在 jQuery 中,美元符($) 是标识符 jQuery 的别名,而 $() 在其它 Javascript 库中比较常见,如果在一个页面中使用了多个 Javascript 库,则会导致冲突。让 jQuery 与其它 Javascript 库协同工作,有三种方法可避免这种情况。

  • 在写 jQuery 代码时把美元符换成 jQuery 关键字。
  • 使用 jQuery jQuery.noConflict() 方法,这个方法表示把 $ 符号过度给其它 javascript 库使用。
  • 使用 IIFE (该方法特别适用于写 jQuery 第三方库插件,体现在:使用美元符别名代替 jQuery 关键字。下文会讨论)

立即调用函数表达式

IIFE 是 Immediately Invoked Function Expression 的缩写,中文翻译为立即调用的函数表达式。这种 Javascript 设计模式实际上是把 library 的代码放在一个作用域中封装起来,使用被封装的 library 代码时,通过其作用域可避免与其它 Javascript 库产生冲突。

IIFE 的基本格式代码片段:

(function(){
  // my special code
})();

上面的 IIFE 只不过是是一个被大括号包裹起来的匿名函数表达式,接着就是一对圆括号调用该匿名函数。接着开始详细分解这个简单的 IIFE 。

调用匿名函数代码片段

// Anonymous function
function(){
  // my special code
}(); // The parentheses make sure the anonymous function gets called immediately

匿名函数,接着在函数后面通过圆括号调用。

包裹匿名函数的圆括号

在 IIFE 的样例中,我们为什么要通过一个圆括号来包裹匿名函数呢?在解释之前,在浏览器的 console 中运行上面的匿名代码片段,你会看到 JS 报错信息。

Uncaught SyntaxError: Unexpected token (

通过圆括号把匿名函数包裹起来,会被解析成 函数表达式 而不是 函数声明 一个函数表达式后面接着一对圆括号表明调用该函数,而函数声明后面接着一对圆括号并不能调用该函数。

注意:在 JavaScript 中,函数表达式和函数声明的区别如下:

var test = function() {}; //函数表达式
function test() {}; //函数声明

通过查看 IIFE 基本格式的代码片段,我们看到匿名函数被圆括号包裹起来了,说明这是函数表达式。并且该匿名函数并没有赋值给任何全局变量,所以在函数表达式中没有一个全局属性(global properties)被创建出来。在函数表达式中创建出来的所有属性(properties) 作用域只在于函数表达式内。

使用 IIFE 的好处

已经掌握 IFFE 的基本概念了,那么在代码中使用有什么好处呢?

  • 缩小对象查找范围
    圆括号调用匿名函数表达式时,传递通用的全局对象(window, document, jQuery 等通用全局对象)到匿名函数。在匿名函数中引用这些全局对象时减少了查找范围。
    注意:JavaScript 查找变量的属性是从内到外的。所在的局部没有找到所需的变量属性,会沿着外层的作用域继续寻找,最后在全局域停止。如果把通用的全局属性传递到函数表达式中,那么查找效率自然提高。
    // Anonymous function that has three arguments
    (function(w, d, $) {
      // You can now reference the window, document, and jQuery objects in a local scope
    })(window, document, window.jQuery); // The global window, document, and jQuery objects are passed into the anonymous function
    
  • 减少代码量,利用别名
    前文提到美元符$ 在很多 JavaScript 中被使用。在 jQuery 代码中使用 jQuery 关键字可避免冲突,但这不是最好的方法。还有一种方法就是使用 IIFE,具体原因如下:
    通过圆括号调用匿名函数时,把全局参数 window, document和 jQuery 作为参数传到匿名函数中作为局部变量。那么在匿名函数表达式中,function(w, d, $),美元符 $ 表示 jQuery, 在匿名函数中使用不会导致与外部作用域产生冲突。

推荐阅读:
Immediately-Invoked Function Expression (IIFE)
What (function (window, document, undefined) {})(window, document); really means

你可能感兴趣的:(IIFE 立即调用的函数表达式)