前言
js立即執行函數可以讓你的函數在創建后立即執行,js立即執行函數模式是一種語法,可以讓你的函數在定義后立即被執行,這種模式本質上就是函數表達式(命名的或者匿名的),在創建后立即執行。
( function(){…} )()和( function (){…} () )是兩種javascript立即執行函數的常見寫法,最初我以為是一個括號包裹匿名函數,再在后面加個括號調用函數,最后達到函數定義后立即執行的目的,后來發現加括號的原因并非如此。
下面話不多說了,來一起看看詳細的介紹吧。
通常我們聲明一個函數有以下幾種方式:
// 聲明函數f1function f1() { console.log("f1");}// 通過()來調用此函數f1();//一個匿名函數的函數表達式,被賦值給變量f2:var f2 = function() { console.log("f2");}//通過()來調用此函數f2();//一個命名為f3的函數的函數表達式(這里的函數名可以隨意命名,可以不必和變量f3重名),被賦值給變量f3:var f3 = function f3() { console.log("f3");}//通過()來調用此函數f3();如果你看過一些自定義控件的話你會發現他們大多數都是沿用這種寫法:
(function() { ``` // 這里開始寫功能需求 })(); 這是我們常說的立即執行函數(IIFE),顧名思義,也就是說這個函數是立即執行函數體的,不需要你額外去主動的去調用,一般情況下我們只對匿名函數使用IIFE,這么做有兩個目的:
一是不必為函數命名,避免了污染全局變量
二是IIFE內部形成了一個單獨的作用域,可以封裝一些外部無法讀取的私有變量。
如果看到這兩句話無法理解,那么先從IIFE的運行原理說起。
因為IIFE通常用于匿名函數,這里就用簡單的匿名函數作為栗子:
var f = function(){ console.log("f");}f();我們發現這里f只是這個匿名函數的一個引用變量,那么既然f()能夠調用這個函數,我把f替換成函數本身可以么:
function(){ console.log("f"); }();運行之后得到如下結果:
Uncaught SyntaxError: Unexpected token (
產生這個錯誤的原因是,Javascript引擎看到function關鍵字之后,認為后面跟的是函數聲明語句,不應該以圓括號結尾。解決方法就是讓引擎知道,圓括號前面的部分不是函數定義語句,而是一個表達式,可以對此進行運算,這里區分一下函數聲明和函數表達式:
1、函數聲明(即我們通常使用function x(){}來聲明一個函數)
function myFunction () { /* logic here */ }2、函數表達式(類似以這種的形式)
var myFunction = function () { /* logic here */ };var myObj = { myFunction: function () { /* logic here */ }};
新聞熱點
疑難解答
圖片精選