IIFE 立即執行函式表示式

2021-07-25 06:33:00 字數 1602 閱讀 1860

原文:

iife 的原理,我簡單說一下:

function

foo() // 這是定義,declaration;定義只是讓直譯器知道其存在,但是不會執行。

foo(); // 這是語句,statement;直譯器遇到語句是會執行它的。

//iife 並非必須,傳統一點可以這麼寫:

function

foo()

foo();

那麼為什麼要 iife?

於是,開發者們想找乙個可以解決以上問題的寫法。那麼像下面這麼寫行不行呢?

function

foo(...){}();

當然是不能,但是為什麼呢?因為function foo(...){}這個部分只是乙個宣告,對於直譯器來說,就好像你寫了乙個字串 「function foo(…){}」,它需要使用解析函式,比如eval()來執行它才可以。所以把 () 直接放在宣告後面是不會執行,這是錯誤的語法。

如何把它變得正確?說起來也簡單,只要把 宣告 變成 表示式(expression) 就可以了。

實際上轉變表示式的辦法還是很多的,最常見的辦法是把函式宣告用一對 () 包裹起來,於是就變成了:

(function

foo() ) // 這裡是故意換行,實際上可以和下面的括號連起來

();

這就等價於:

var foo = function

() ; // 這就不是定義,而是表示式了。

foo();

但是之前我們說不行的那個寫法,其實也可以直接用括號包起來,這也是一種等價的表示式:

(function

foo()());

所以你問有沒有區別?很簡單:木有~

另外,剛才說過轉變表示式的方式很多,的確還有很多別的寫法,比如:

!function

foo() ();

或者

+function

foo() ();

這些都可以。

我個人挺偏愛用 void 來轉變表示式,因為此關鍵字不會有返回值。不過這一點真的沒有什麼要緊的,就當我「龜毛」好了……

void

function

() ();

ok,所謂不去汙染全域性命名空間,是因為 iife 建立了乙個新的函式作用域,你真正的業務**被封裝在其中,自然就不會觸碰到全域性物件了。如果你需要全域性物件,那就 pass 給 iife:

void

function

(global) (this) // 在瀏覽器裡,this 就是 window 物件

這個例子便於理解

(function

(param))("this is a test");

立即執行函式表示式IIFE

一 iife解釋 全拼imdiately invoked function expression,立即執行的函式表示式。像如下的 所示,就是乙個匿名立即執行函式 function window,undefined window 二 括號的意義 2.1 包住function 的括號的意義 這個括號的目...

立即執行函式表示式 自執行函式

立即執行函式表示式,大部分人也稱為自執行函式。匿名函式 function 具名函式 function log 自執行函式的傳參 function add a,b 1,2 返回值let fn function add a,b 2,4 console.log fn 自執行函式也可以傳遞函式作為引數var...

javascript立即呼叫的函式表示式

1.什麼是自執行的匿名函式?它是指形如這樣的函式 function 2.疑問 為什麼 function 可以被執行,而function 卻會報錯?3.分析 1 首先,要清楚兩者的區別 function 是表示式,function 是函式宣告.2 其次,js 預編譯 的特點 js在 預編譯 階段,會解...