1. 程式人生 > >(轉)掃盲--JavaScript的立即執行函數

(轉)掃盲--JavaScript的立即執行函數

匿名函數 作用 atp style 訪問 其中 私有 運算 沖突

看過jQuery源碼的人應該知道,jQuery開篇用的就是立即執行函數。立即執行函數常用於第三方庫,好處在於隔離作用域,任何一個第三方庫都會存在大量的變量和函數,為了避免變量汙染(命名沖突),開發者們想到的解決辦法就是使用立即執行函數。

1.什麽是立即執行函數(IIFE)

在了解立即執行函數之前先明確一下函數聲明、函數表達式及匿名函數的形式,如下圖:

技術分享圖片

接下來看立即執行函數的兩種常見形式:( function(){…} )()和( function (){…} () ),一個是一個匿名函數包裹在一個括號運算符中,後面再跟一個小括號,另一個是一個匿名函數後面跟一個小括號,然後整個包裹在一個括號運算符中,這兩種寫法是等價的。要想立即執行函數能做到立即執行,要註意兩點,一是函數體後面要有小括號(),二是函數體必須是函數表達式而不能是函數聲明。先看下圖:

技術分享圖片

從圖中可以看出,除了使用()運算符之外,!,+,-,=等運算符都能起到立即執行的作用。這些運算符的作用就是將匿名函數或函數聲明轉換為函數表達式,如下圖所示,函數體是函數聲明的形式,使用運算符將其轉換為函數表達式之後就可達到立即執行效果:

技術分享圖片

2.使用立即執行函數的好處

通過定義一個匿名函數,創建了一個新的函數作用域,相當於創建了一個“私有”的命名空間,該命名空間的變量和方法,不會破壞汙染全局的命名空間。此時若是想訪問全局對象,將全局對象以參數形式傳進去即可,如jQuery代碼結構:

技術分享圖片

其中window即是全局對象。作用域隔離非常重要,是一個JS框架必須支持的功能,jQuery被應用在成千上萬的JavaScript程序中,必須確保jQuery創建的變量不能和導入他的程序所使用的變量發生沖突。

(轉)掃盲--JavaScript的立即執行函數