国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 14:59:41
字體:
供稿:網(wǎng)友

前言

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

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

下面話不多說了,來一起看看詳細的介紹吧。

通常我們聲明一個函數(shù)有以下幾種方式:

// 聲明函數(shù)f1function f1() { console.log("f1");}// 通過()來調(diào)用此函數(shù)f1();//一個匿名函數(shù)的函數(shù)表達式,被賦值給變量f2:var f2 = function() { console.log("f2");}//通過()來調(diào)用此函數(shù)f2();//一個命名為f3的函數(shù)的函數(shù)表達式(這里的函數(shù)名可以隨意命名,可以不必和變量f3重名),被賦值給變量f3:var f3 = function f3() { console.log("f3");}//通過()來調(diào)用此函數(shù)f3();

如果你看過一些自定義控件的話你會發(fā)現(xiàn)他們大多數(shù)都是沿用這種寫法:

(function() { ``` // 這里開始寫功能需求 })(); 

這是我們常說的立即執(zhí)行函數(shù)(IIFE),顧名思義,也就是說這個函數(shù)是立即執(zhí)行函數(shù)體的,不需要你額外去主動的去調(diào)用,一般情況下我們只對匿名函數(shù)使用IIFE,這么做有兩個目的:

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

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

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

因為IIFE通常用于匿名函數(shù),這里就用簡單的匿名函數(shù)作為栗子:

var f = function(){ console.log("f");}f();

我們發(fā)現(xiàn)這里f只是這個匿名函數(shù)的一個引用變量,那么既然f()能夠調(diào)用這個函數(shù),我把f替換成函數(shù)本身可以么:

function(){ console.log("f"); }();

運行之后得到如下結(jié)果:

Uncaught SyntaxError: Unexpected token (

產(chǎn)生這個錯誤的原因是,Javascript引擎看到function關(guān)鍵字之后,認為后面跟的是函數(shù)聲明語句,不應(yīng)該以圓括號結(jié)尾。解決方法就是讓引擎知道,圓括號前面的部分不是函數(shù)定義語句,而是一個表達式,可以對此進行運算,這里區(qū)分一下函數(shù)聲明和函數(shù)表達式:

1、函數(shù)聲明(即我們通常使用function x(){}來聲明一個函數(shù))

function myFunction () { /* logic here */ }

2、函數(shù)表達式(類似以這種的形式)

var myFunction = function () { /* logic here */ };var myObj = { myFunction: function () { /* logic here */ }};

小學(xué)我們就學(xué)過用()括起來的表達式會先執(zhí)行,就像下面這樣:

1+(2+3) //這里先運行小括號里面的內(nèi)容沒有意見撒

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

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

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

f //控制臺輸出

這種情況下Javascript引擎就會認為這是一個表達式,而不是函數(shù)聲明,當(dāng)然要讓Javascript引擎認為這是一個表達式的方法還有很多:

!function(){}();+function(){}();-function(){}();~function(){}();new function(){ /* code */ }new function(){ /* code */ }() // 只有傳遞參數(shù)時,才需要最后那個圓括號。……

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

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

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

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

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 驻马店市| 卓尼县| 盐亭县| 响水县| 平乡县| 平武县| 沛县| 金门县| 三台县| 西华县| 滦平县| 新巴尔虎左旗| 南华县| 西安市| 桓台县| 甘南县| 旌德县| 剑阁县| 吐鲁番市| 师宗县| 巢湖市| 安阳县| 浪卡子县| 外汇| 嘉黎县| 伊金霍洛旗| 商南县| 宁强县| 台前县| 西充县| 通许县| 昔阳县| 南和县| 保靖县| 葵青区| 旌德县| 瑞金市| 双牌县| 德惠市| 同仁县| 沁水县|