深刻理解js當即執行函數

看過jQuery源碼的人應該知道,jQuery開篇用的就是當即執行函數。當即執行函數經常使用於第三方庫,好處在於隔離做用域,任何一個第三方庫都會存在大量的變量和函數,爲了不變量污染(命名衝突),開發者們想到的解決辦法就是使用當即執行函數。框架

1.什麼是當即執行函數(IIFE)函數

在瞭解當即執行函數以前先明確一下函數聲明、函數表達式及匿名函數的形式,以下圖:對象

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

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

2.使用當即執行函數的好處作用域

經過定義一個匿名函數,建立了一個新的函數做用域,至關於建立了一個「私有」的命名空間,該命名空間的變量和方法,不會破壞污染全局的命名空間。此時如果想訪問全局對象,將全局對象以參數形式傳進去便可,如jQuery代碼結構:開發

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

相關文章
相關標籤/搜索