javascript和其他程式語言比較比較隨意,所以javascript程式碼充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。本文主要為大家介紹了JavaScript中立即執行函數的相關資料,希望能幫助大家。
前言
js立即執行函數可以讓你的函數在建立後立即執行,js立即執行函數模式是一種語法,可以讓你的函數在定義後立即被執行,這種模式本質上就是函數表達式(命名的或匿名的),在創建後立即執行。
( function(){…} )()和( function (){…} () )是兩種javascript立即執行函數的常見寫法,最初我以為是一個括號包裹匿名函數,再在後面加個括號呼叫函數,最後達到函數定義後立即執行的目的,後來發現加括號的原因並非如此。
下面話不多說了,來一起看看詳細的介紹吧。
通常我們宣告一個函數有以下幾種方式:
#// 声明函数f1 function 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 */ } };
#小學我們就學過用()括起來的表達式會先執行,就像下面這樣:
1+(2+3) //这里先运行小括号里面的内容没有意见撒
其實在javascript中小括號中也有類似的作用,Javascript引擎看到function關鍵字會認為是函數宣告語句,那麼如果Javascript引擎優先看到小括號會怎麼樣:
//用小括号把函数包裹起来 (function(){ console.log("f"); })();
函數成功執行了:
f //控制台输出
這種情況下Javascript引擎就會認為這是一個表達式,而不是函數聲明,當然要讓Javascript引擎認為這是一個表達式的方法還有很多:
##
!function(){}(); +function(){}(); -function(){}(); ~function(){}(); new function(){ /* code */ } new function(){ /* code */ }() // 只有传递参数时,才需要最后那个圆括号。 ……
(function($){ " //插件实现代码 })(jQuery);
#JavaScript立即執行函數的三種不同寫法_javascript技巧
JavaScript中的立即執行函數表達式介紹_javascript技巧
以上是JavaScript中立即執行函數實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!