欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中立即執(zhí)行函數(shù)實(shí)例詳解

 更新時(shí)間:2017年11月04日 11:08:53   作者:李牧羊  
javascript和其他編程語言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時(shí)霧里看花,當(dāng)然,能理解各型各色的寫法也是對(duì)javascript語言特性更進(jìn)一步的深入理解。這篇文章主要給大家介紹了關(guān)于JavaScript中立即執(zhí)行函數(shù)的相關(guān)資料,需要的朋友可以參考下。

前言

js立即執(zhí)行函數(shù)可以讓你的函數(shù)在創(chuàng)建后立即執(zhí)行,js立即執(zhí)行函數(shù)模式是一種語法,可以讓你的函數(shù)在定義后立即被執(zhí)行,這種模式本質(zhì)上就是函數(shù)表達(dá)式(命名的或者匿名的),在創(chuàng)建后立即執(zhí)行。

( function(){…} )()和( function (){…} () )是兩種javascript立即執(zhí)行函數(shù)的常見寫法,最初我以為是一個(gè)括號(hào)包裹匿名函數(shù),再在后面加個(gè)括號(hào)調(diào)用函數(shù),最后達(dá)到函數(shù)定義后立即執(zhí)行的目的,后來發(fā)現(xiàn)加括號(hào)的原因并非如此。

下面話不多說了,來一起看看詳細(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)用,一般情況下我們只對(duì)匿名函數(shù)使用IIFE,這么做有兩個(gè)目的:

     一是不必為函數(shù)命名,避免了污染全局變量

     二是IIFE內(nèi)部形成了一個(gè)單獨(dú)的作用域,可以封裝一些外部無法讀取的私有變量。

如果看到這兩句話無法理解,那么先從IIFE的運(yùn)行原理說起。

因?yàn)镮IFE通常用于匿名函數(shù),這里就用簡(jiǎn)單的匿名函數(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)該以圓括號(hào)結(jié)尾。解決方法就是讓引擎知道,圓括號(hào)前面的部分不是函數(shù)定義語句,而是一個(gè)表達(dá)式,可以對(duì)此進(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)行小括號(hào)里面的內(nèi)容沒有意見撒

其實(shí)在javascript中小括號(hào)也有相似的作用,Javascript引擎看到function關(guān)鍵字會(huì)認(rèn)為是函數(shù)聲明語句,那么如果Javascript引擎優(yōu)先看到小括號(hào)會(huì)怎么樣:

//用小括號(hào)把函數(shù)包裹起來
(function(){
  console.log("f");  
})();

函數(shù)成功執(zhí)行了:

f //控制臺(tái)輸出

這種情況下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è)圓括號(hào)。
……

回到前面的問題,為什么說IIFE這種形式避免了污染全局變量,如果你見過別人寫的jquery插件,里面通常會(huì)有類似這樣的代碼:

(function($){
  ```
  //插件實(shí)現(xiàn)代碼
})(jQuery);

這里的jquery其實(shí)是該匿名函數(shù)的參數(shù),聯(lián)想一下我們調(diào)用匿名函數(shù)時(shí)候是用f()那么匿名帶參數(shù)的就是f(args)對(duì)吧,這里把jquery作為參數(shù)傳入該函數(shù),那么在函數(shù)內(nèi)部使用形參$的時(shí)候就不會(huì)影響到外部環(huán)境,因?yàn)橛行┎寮矔?huì)用到$這個(gè)限定符,你在這個(gè)函數(shù)內(nèi)部可以隨意折騰。

以上,在此過程中參考了以下兩篇文章:

javascript立即執(zhí)行某個(gè)函數(shù):插件中function(){}()再思考

JavaScript中的立即執(zhí)行函數(shù)

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • js與jQuery實(shí)現(xiàn)的用戶注冊(cè)協(xié)議倒計(jì)時(shí)功能實(shí)例【三種方法】

    js與jQuery實(shí)現(xiàn)的用戶注冊(cè)協(xié)議倒計(jì)時(shí)功能實(shí)例【三種方法】

    這篇文章主要介紹了js與jQuery實(shí)現(xiàn)的用戶注冊(cè)協(xié)議倒計(jì)時(shí)功能,結(jié)合實(shí)例形式分析了三種倒計(jì)時(shí)功能的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • Bootstrap Fileinput 4.4.7文件上傳實(shí)例詳解

    Bootstrap Fileinput 4.4.7文件上傳實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap Fileinput 4.4.7文件上傳實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • VSCode中如何利用d.ts文件進(jìn)行js智能提示

    VSCode中如何利用d.ts文件進(jìn)行js智能提示

    這篇文章主要給大家介紹了關(guān)于VSCode中如何利用d.ts文件進(jìn)行js智能提示的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2018-04-04
  • 原生js編寫貪吃蛇小游戲

    原生js編寫貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了原生js編寫貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • js面向?qū)ο笾?、私有、靜態(tài)屬性和方法詳解

    js面向?qū)ο笾?、私有、靜態(tài)屬性和方法詳解

    這篇文章主要詳細(xì)介紹了js面向?qū)ο笾小⑺接?、靜態(tài)屬性和方法,并附上詳細(xì)的示例,非常的細(xì)致全面,這里推薦給大家,有需要的小伙伴可以參考下
    2015-04-04
  • jQuery檢測(cè)輸入的字符串包含的中英文的數(shù)量

    jQuery檢測(cè)輸入的字符串包含的中英文的數(shù)量

    這篇文章主要介紹了jQuery檢測(cè)輸入的字符串包含的中英文的數(shù)量的實(shí)現(xiàn)方法,非常的實(shí)用,這里推薦給小伙伴,有需要的朋友可以參考下。
    2015-04-04
  • javascript 通用簡(jiǎn)單的table選項(xiàng)卡實(shí)現(xiàn)

    javascript 通用簡(jiǎn)單的table選項(xiàng)卡實(shí)現(xiàn)

    鑒于UI妹妹每次交付過來的選項(xiàng)卡都夾帶了多多少少的js,而且每遇到選項(xiàng)卡就加一點(diǎn)js,造成垃圾低劣代碼逐漸堆積過多了,一直想做一個(gè)通用簡(jiǎn)潔的選項(xiàng)卡庫(kù)。
    2010-05-05
  • 微信小程序之GET請(qǐng)求的實(shí)例詳解

    微信小程序之GET請(qǐng)求的實(shí)例詳解

    這篇文章主要介紹了微信小程序之GET請(qǐng)求的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握該如何使用get請(qǐng)求,需要的朋友可以參考下
    2017-09-09
  • 值得分享的Bootstrap Table使用教程

    值得分享的Bootstrap Table使用教程

    一套值得分享和大家收藏的Bootstrap學(xué)習(xí)教程,完整的知識(shí)體系,系統(tǒng)的學(xué)習(xí)資料,幫助大家開啟Bootstrap Table學(xué)習(xí)之旅,享受學(xué)習(xí)的樂趣
    2016-11-11
  • 如何實(shí)現(xiàn)axios的自定義適配器adapter

    如何實(shí)現(xiàn)axios的自定義適配器adapter

    Axios是一個(gè)非常優(yōu)秀的基于promise的HTTP庫(kù),可以用在瀏覽器和node.js中。并且提供了很多便捷的功能,但如果我們想基于axios 擴(kuò)展一些自己的數(shù)據(jù)請(qǐng)求方式(例如某些APP內(nèi)專屬的數(shù)據(jù)請(qǐng)求方式等),并能夠使用上axios提供的便捷功能,該怎么自定義一個(gè)適配器adapter
    2021-05-05

最新評(píng)論