摘要:將匿名函數(shù)賦予一個變量,叫函數(shù)表達式,這是最常見的函數(shù)表達式語法形式。組成這是一個被稱為自執(zhí)行匿名函數(shù)的設(shè)計模式,主要包含兩部分。
一、函數(shù)聲明&函數(shù)表達式 1.1 函數(shù)聲明 (函數(shù)語句)
(1)使用 function 關(guān)鍵字聲明一個函數(shù),再指定一個函數(shù)名,叫函數(shù)聲明。
(2)【注意】JavaScript引擎規(guī)定,如果function關(guān)鍵字出現(xiàn)在行首,一律解釋成函數(shù)聲明語句
1.2 函數(shù)表達式 (function expression)(1)使用 function 關(guān)鍵字聲明一個函數(shù),函數(shù)名稱可被省略,此種情況下的函數(shù)是 匿名函數(shù)(anonymous)。 函數(shù)名稱只是函數(shù)體中的一個本地變量。
(2)將匿名函數(shù)賦予一個變量,叫函數(shù)表達式,這是最常見的函數(shù)表達式語法形式。
1.3 匿名函數(shù)(1)下面是匿名函數(shù)的一個例子(函數(shù)沒有名字)。
(2)也可以在定義時為函數(shù)命名。
(3)命名函數(shù)表達式的好處是當我們遇到錯誤時,堆棧跟蹤會顯示函數(shù)名,容易尋找錯誤。
(4)可以看到,上面的兩個例子都不以function開頭。不以function開頭的函數(shù)語句就是函數(shù)表達式定義。
1.4 IIFE(1)但有時需要在定義函數(shù)之后,立即調(diào)用該函數(shù)(函數(shù)只使用一次)。這種函數(shù)就叫做立即執(zhí)行函數(shù),全稱為立即調(diào)用函數(shù)表達式IIFE(Imdiately Invoked Function Expression)
二、立即調(diào)用函數(shù)表達式 2.1 概念立即調(diào)用函數(shù)表達式(IIFE)是一個在定義時就會立即執(zhí)行的 JavaScript 函數(shù)。2.2 組成
(1)這是一個被稱為 自執(zhí)行匿名函數(shù) 的設(shè)計模式,主要包含兩部分。第一部分是包圍在 圓括號運算符() 里的一個匿名函數(shù)。
(2)第二部分再一次使用 () 創(chuàng)建了一個立即執(zhí)行函數(shù)表達式,JavaScript 引擎到此將直接執(zhí)行函數(shù)。
2.3 寫法(1)【最常用的兩種辦法】
(2)【其他寫法】
2.4 括號(1)無論何時,給立即執(zhí)行函數(shù) 加上括號 是個好習慣。
(2)通過以上的介紹,我們大概了解通過()可以使得一個函數(shù)表達式立即執(zhí)行。
(3)有的時候,我們實際上不需要使用()使之變成一個函數(shù)表達式,啥意思?比如下面這行代碼,其實不加上()也不會保錯。
(4)但是我們依然推薦加上()。
(5)為什么?因為我們在閱讀代碼的時候,如果 function 內(nèi)部代碼量龐大,我們不得不滾動到最后去查看 function(){} 后 是否帶有(),用來確定 i 的值,并判斷是 function 還是 function內(nèi)部的返回值。所以為了代碼的可讀性,請盡量加上(),無論是否已經(jīng)是表達式。
2.4 作用(1)IIFE 中的匿名函數(shù)擁有 獨立的詞法作用域。這不僅避免了外界訪問此 IIFE 中的變量,而且又不會污染全局作用域。(另一種說法 【構(gòu)造一個函數(shù)作用域,防止污染全局變量】)
(2)JavaScript 沒用私有作用域的概念,如果是在多人開發(fā)的項目,你在全局或局部作用域中聲明的變量,可能會被其他人不小心用同名的變量給 覆蓋,根據(jù)JavaScript 函數(shù)作用域鏈的特性,使用這種技術(shù)可以模仿一個私有作用域,匿名函數(shù)作為一個“容器”,“容器”內(nèi)部可以訪問外部的變量,而外部環(huán)境不能訪問“容器”內(nèi)部的變量,所以 ( function(){…} )() 內(nèi)部定義的變量不會和外部的變量發(fā)生沖突,俗稱“匿名包裹器”或“命名空間”。
(3)【注意】將 IIFE 分配給一個變量,不是存儲 IIFE 本身,而是存儲 IIFE 執(zhí)行后返回的結(jié)果。
2.5 示例接下來用一個需求實現(xiàn)來更直觀地說明IIFE的用途。假設(shè)有一個需求,每次調(diào)用函數(shù),都返回加1的一個數(shù)字(數(shù)字初始值為0)
【1】全局變量
一般情況下,我們會使用全局變量來保存該數(shù)字狀態(tài)
【2】自定義屬性
但上面的方法中,變量a實際上只和add函數(shù)相關(guān),卻聲明為全局變量,不太合適
將變量a更改為函數(shù)的自定義屬性更為恰當
【3】IIFE
其實這樣做,還是有問題。有些代碼可能會無意中將add.count重置
使用IIFE把計數(shù)器變量保存為私有變量更安全,同時也可以減少對全局空間的污染
閱讀更多
參考文章
深入理解JavaScript系列(4):立即調(diào)用的函數(shù)表達式 湯姆大叔
(譯)詳解javascript立即執(zhí)行函數(shù)表達式(IIFE) 韓子遲
深入理解閉包系列第三篇——IIFE 小火柴的藍色理想
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107835.html
摘要:所以那些匿名函數(shù)附近使用括號或一些一元運算符的慣用法,就是來引導解析器,指明運算符附近是一個表達式。 Immediately-invoked Function Expression(IIFE,立即調(diào)用函數(shù)),簡單的理解就是定義完成函數(shù)之后立即執(zhí)行。因此有時候也會被稱為自執(zhí)行的匿名函數(shù)(self-executing anonymous function)。 IIFE的叫法最早見于Ben...
摘要:而且,如果你想跳過這里,你可以直接跳到立即調(diào)用函數(shù)表達式進行閱讀,但是我建議你讀完整篇文章。當圓括號包裹函數(shù)時,它會默認將函數(shù)作為表達式去解析,而不是函數(shù)聲明。什么是呢它使一個被立即調(diào)用的函數(shù)表達式。一旦命名,函數(shù)將不再匿名。 原文:http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iif...
摘要:另外,如果你想跳過這里,你可以直接跳到立即調(diào)用函數(shù)表達式進行閱讀,但是我建議你讀完整篇文章。當圓括號包裹函數(shù)時,它會默認將函數(shù)作為表達式去解析,而不是函數(shù)聲明。 原文:Immediately-Invoked Function Expression (IIFE) by Ben Alman原譯:立即執(zhí)行函數(shù) by Murphywuwu改增內(nèi)容: by blanu 也許你沒有注意到,我是一個...
摘要:中函數(shù)是一等公民。小明小明調(diào)用函數(shù)時,傳遞給函數(shù)的值被稱為函數(shù)的實參值傳遞,對應(yīng)位置的函數(shù)參數(shù)名叫作形參。所以不推薦使用構(gòu)造函數(shù)創(chuàng)建函數(shù)因為它需要的函數(shù)體作為字符串可能會阻止一些引擎優(yōu)化也會引起瀏覽器資源回收等問題。 函數(shù) 之前幾節(jié)中圍繞著函數(shù)梳理了 this、原型鏈、作用域鏈、閉包等內(nèi)容,這一節(jié)梳理一下函數(shù)本身的一些特點。 javascript 中函數(shù)是一等公民。 并且函數(shù)也是對象,...
閱讀 1138·2021-11-19 09:40
閱讀 980·2021-11-12 10:36
閱讀 1278·2021-09-22 16:04
閱讀 3122·2021-09-09 11:39
閱讀 1279·2019-08-30 10:51
閱讀 1894·2019-08-30 10:48
閱讀 1237·2019-08-29 16:30
閱讀 483·2019-08-29 12:37