JavaScript中立即執(zhí)行函數(shù)實(shí)例詳解
前言
js立即執(zhí)行函數(shù)可以讓你的函數(shù)在創(chuàng)建后立即執(zhí)行,js立即執(zhí)行函數(shù)模式是一種語法,可以讓你的函數(shù)在定義后立即被執(zhí)行,這種模式本質(zhì)上就是函數(shù)表達(dá)式(命名的或者匿名的),在創(chuàng)建后立即執(zhí)行。
( function(){…} )()和( function (){…} () )是兩種javascript立即執(zhí)行函數(shù)的常見寫法,最初我以為是一個(gè)括號包裹匿名函數(shù),再在后面加個(gè)括號調(diào)用函數(shù),最后達(dá)到函數(shù)定義后立即執(zhí)行的目的,后來發(fā)現(xiàn)加括號的原因并非如此。
下面話不多說了,來一起看看詳細(xì)的介紹吧。
通常我們聲明一個(gè)函數(shù)有以下幾種方式:
// 聲明函數(shù)f1
function f1() {
console.log("f1");
}
// 通過()來調(diào)用此函數(shù)
f1();
//一個(gè)匿名函數(shù)的函數(shù)表達(dá)式,被賦值給變量f2:
var f2 = function() {
console.log("f2");
}
//通過()來調(diào)用此函數(shù)
f2();
//一個(gè)命名為f3的函數(shù)的函數(shù)表達(dá)式(這里的函數(shù)名可以隨意命名,可以不必和變量f3重名),被賦值給變量f3:
var f3 = function f3() {
console.log("f3");
}
//通過()來調(diào)用此函數(shù)
f3();
如果你看過一些自定義控件的話你會(huì)發(fā)現(xiàn)他們大多數(shù)都是沿用這種寫法:
(function() {
```
// 這里開始寫功能需求
})();
這是我們常說的立即執(zhí)行函數(shù)(IIFE),顧名思義,也就是說這個(gè)函數(shù)是立即執(zhí)行函數(shù)體的,不需要你額外去主動(dòng)的去調(diào)用,一般情況下我們只對匿名函數(shù)使用IIFE,這么做有兩個(gè)目的:
一是不必為函數(shù)命名,避免了污染全局變量
二是IIFE內(nèi)部形成了一個(gè)單獨(dú)的作用域,可以封裝一些外部無法讀取的私有變量。
如果看到這兩句話無法理解,那么先從IIFE的運(yùn)行原理說起。
因?yàn)镮IFE通常用于匿名函數(shù),這里就用簡單的匿名函數(shù)作為栗子:
var f = function(){
console.log("f");
}
f();
我們發(fā)現(xiàn)這里f只是這個(gè)匿名函數(shù)的一個(gè)引用變量,那么既然f()能夠調(diào)用這個(gè)函數(shù),我把f替換成函數(shù)本身可以么:
function(){
console.log("f");
}();
運(yùn)行之后得到如下結(jié)果:
Uncaught SyntaxError: Unexpected token (
產(chǎn)生這個(gè)錯(cuò)誤的原因是,Javascript引擎看到function關(guān)鍵字之后,認(rèn)為后面跟的是函數(shù)聲明語句,不應(yīng)該以圓括號結(jié)尾。解決方法就是讓引擎知道,圓括號前面的部分不是函數(shù)定義語句,而是一個(gè)表達(dá)式,可以對此進(jìn)行運(yùn)算,這里區(qū)分一下函數(shù)聲明和函數(shù)表達(dá)式:
1、函數(shù)聲明(即我們通常使用function x(){}來聲明一個(gè)函數(shù))
function myFunction () { /* logic here */ }
2、函數(shù)表達(dá)式(類似以這種的形式)
var myFunction = function () { /* logic here */ };
var myObj = {
myFunction: function () { /* logic here */ }
};
小學(xué)我們就學(xué)過用()括起來的表達(dá)式會(huì)先執(zhí)行,就像下面這樣:
1+(2+3) //這里先運(yùn)行小括號里面的內(nèi)容沒有意見撒
其實(shí)在javascript中小括號也有相似的作用,Javascript引擎看到function關(guān)鍵字會(huì)認(rèn)為是函數(shù)聲明語句,那么如果Javascript引擎優(yōu)先看到小括號會(huì)怎么樣:
//用小括號把函數(shù)包裹起來
(function(){
console.log("f");
})();
函數(shù)成功執(zhí)行了:
f //控制臺輸出
這種情況下Javascript引擎就會(huì)認(rèn)為這是一個(gè)表達(dá)式,而不是函數(shù)聲明,當(dāng)然要讓Javascript引擎認(rèn)為這是一個(gè)表達(dá)式的方法還有很多:
!function(){}();
+function(){}();
-function(){}();
~function(){}();
new function(){ /* code */ }
new function(){ /* code */ }() // 只有傳遞參數(shù)時(shí),才需要最后那個(gè)圓括號。
……
回到前面的問題,為什么說IIFE這種形式避免了污染全局變量,如果你見過別人寫的jquery插件,里面通常會(huì)有類似這樣的代碼:
(function($){
```
//插件實(shí)現(xiàn)代碼
})(jQuery);
這里的jquery其實(shí)是該匿名函數(shù)的參數(shù),聯(lián)想一下我們調(diào)用匿名函數(shù)時(shí)候是用f()那么匿名帶參數(shù)的就是f(args)對吧,這里把jquery作為參數(shù)傳入該函數(shù),那么在函數(shù)內(nèi)部使用形參$的時(shí)候就不會(huì)影響到外部環(huán)境,因?yàn)橛行┎寮矔?huì)用到$這個(gè)限定符,你在這個(gè)函數(shù)內(nèi)部可以隨意折騰。
以上,在此過程中參考了以下兩篇文章:
javascript立即執(zhí)行某個(gè)函數(shù):插件中function(){}()再思考
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
小程序點(diǎn)擊圖片實(shí)現(xiàn)png轉(zhuǎn)jpg
這篇文章主要介紹了小程序點(diǎn)擊圖片實(shí)現(xiàn)png轉(zhuǎn)jpg,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
使用JavaScript給圖片添加水印的實(shí)現(xiàn)方法封裝
圖片加水印是一種常見的圖像處理技術(shù),通常用于保護(hù)版權(quán)、防止盜用、增加圖片的識別度等多種場景,這篇文章主要給大家介紹了關(guān)于使用JavaScript給圖片添加水印的實(shí)現(xiàn)方法封裝,需要的朋友可以參考下2024-03-03
JavaScript實(shí)現(xiàn)重力下落與彈性效果的方法分析
這篇文章主要介紹了JavaScript實(shí)現(xiàn)重力下落與彈性效果的方法,結(jié)合實(shí)例形式分析了javascript重力下落及彈性效果的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
JavaScript字符串的json的自定義加密解密函數(shù)示例
JavaScript自定義函數(shù)中使用String.fromCharCode函數(shù)將輸入字符串中每個(gè)字符的Unicode編碼加1,然后將加密后的字符拼接成一個(gè)新字符串返回,調(diào)用JSON.stringify函數(shù)轉(zhuǎn)換json成一個(gè)普通字符串2023-12-12
微信小程序如何實(shí)現(xiàn)商品列表跳轉(zhuǎn)商品詳情頁功能
最近在學(xué)微信小程序開發(fā)的時(shí)候,碰上了一個(gè)問題,所以想著總結(jié)下,這篇文章主要給大家介紹了關(guān)于微信小程序如何實(shí)現(xiàn)商品列表跳轉(zhuǎn)商品詳情頁功能的相關(guān)資料,需要的朋友可以參考下2022-04-04
javascript另類方法實(shí)現(xiàn)htmlencode()與htmldecode()函數(shù)實(shí)例分析
這篇文章主要介紹了javascript另類方法實(shí)現(xiàn)htmlencode()與htmldecode()函數(shù),結(jié)合實(shí)例形式分析了javascript字符編碼與解碼操作的相關(guān)技巧,需要的朋友可以參考下2016-11-11
JS實(shí)現(xiàn)移動(dòng)端觸屏拖拽功能
這篇文章主要介紹了JS實(shí)現(xiàn)移動(dòng)端觸屏拖拽功能,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
JavaScript setinterval延遲一秒解決方案
這篇文章主要介紹了JavaScript setinterval延遲一秒解決方案,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Save a File Using a File Save Dialog Box
Save a File Using a File Save Dialog Box...2007-06-06
el-tree限制選中個(gè)數(shù)的實(shí)例
這篇文章主要介紹了el-tree限制選中個(gè)數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08

