最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js閉包的9個使用場景

 更新時間:2020年12月29日 11:47:56   作者:林恒  
這篇文章主要介紹了js 閉包的9個使用場景,幫助大家更好的理解和學習JavaScript 閉包的使用,感興趣的朋友可以了解下

1.返回值(最常用)

//1.返回值 最常用的
    function fn(){
        var name="hello";
        return function(){
            return name;
        }
    }
    var fnc = fn();
    console.log(fnc())//hello

這個很好理解就是以閉包的形式將 name 返回。

2.函數(shù)賦值

var fn2;
function fn(){
    var name="hello";
    //將函數(shù)賦值給fn2
    fn2 = function(){
        return name;
    }
}
fn()//要先執(zhí)行進行賦值,
console.log(fn2())//執(zhí)行輸出fn2

在閉包里面給fn2函數(shù)設置值,閉包的形式把name屬性記憶下來,執(zhí)行會輸出 hello。

3.函數(shù)參數(shù)

function fn(){
    var name="hello";
    return function callback(){
        return name;
    }
}
var fn1 = fn()//執(zhí)行函數(shù)將返回值(callback函數(shù))賦值給fn1,
 
function fn2(f){
    //將函數(shù)作為參數(shù)傳入
    console.log(f());//執(zhí)行函數(shù),并輸出
}
fn2(fn1)//執(zhí)行輸出fn2

用閉包返回一個函數(shù),把此函數(shù)作為另一個函數(shù)的參數(shù),在另一個函數(shù)里面執(zhí)行這個函數(shù),最終輸出 hello

4.IIFE(自執(zhí)行函數(shù))

(function(){
        var name="hello";
        var fn1= function(){
            return name;
        }
        //直接在自執(zhí)行函數(shù)里面調(diào)用fn2,將fn1作為參數(shù)傳入
        fn2(fn1);
    })()
    function fn2(f){
        //將函數(shù)作為參數(shù)傳入
        console.log(f());//執(zhí)行函數(shù),并輸出
    }

直接在自執(zhí)行函數(shù)里面將封裝的函數(shù)fn1傳給fn2,作為參數(shù)調(diào)用同樣可以獲得結(jié)果 hello

5.循環(huán)賦值

//每秒執(zhí)行1次,分別輸出1-10
for(var i=1;i<=10;i++){
    (function(j){
        //j來接收
        setTimeout(function(){
            console.log(j);
        },j*1000);
    })(i)//i作為實參傳入
}

如果不采用閉包的話,會有不一樣的情況,可以看我自己 閉包 的文章。

6.getter和setter

function fn(){
        var name='hello'
        setName=function(n){
            name = n;
        }
        getName=function(){
            return name;
        }
         
        //將setName,getName作為對象的屬性返回
        return {
            setName:setName,
            getName:getName
        }
    }
    var fn1 = fn();//返回對象,屬性setName和getName是兩個函數(shù)
    console.log(fn1.getName());//getter
        fn1.setName('world');//setter修改閉包里面的name
    console.log(fn1.getName());//getter

第一次輸出 hello 用setter以后再輸出 world ,這樣做可以封裝成公共方法,防止不想暴露的屬性和函數(shù)暴露在外部。

7.迭代器(執(zhí)行一次函數(shù)往下取一個值)

var arr =['aa','bb','cc'];
function incre(arr){
    var i=0;
    return function(){
        //這個函數(shù)每次被執(zhí)行都返回數(shù)組arr中 i下標對應的元素
         return arr[i++] || '數(shù)組值已經(jīng)遍歷完';
    }
}
var next = incre(arr);
console.log(next());//aa
console.log(next());//bb
console.log(next());//cc
console.log(next());//數(shù)組值已經(jīng)遍歷完

8.首次區(qū)分(相同的參數(shù),函數(shù)不會重復執(zhí)行)

var fn = (function(){
               var arr=[];//用來緩存的數(shù)組
                   return function(val){
                       if(arr.indexOf(val)==-1){//緩存中沒有則表示需要執(zhí)行
                           arr.push(val);//將參數(shù)push到緩存數(shù)組中
                           console.log('函數(shù)被執(zhí)行了',arr);
                           //這里寫想要執(zhí)行的函數(shù)
                       }else{
                           console.log('此次函數(shù)不需要執(zhí)行');
                       }
                       console.log('函數(shù)調(diào)用完打印一下,方便查看已緩存的數(shù)組:',arr);
                   }
               })();
        
       fn(10);
       fn(10);
       fn(1000);
       fn(200);
       fn(1000);

執(zhí)行結(jié)果如下:

可以明顯的看到首次執(zhí)行的會被存起來,再次執(zhí)行直接取。

9.緩存

//比如求和操作,如果沒有緩存,每次調(diào)用都要重復計算,采用緩存已經(jīng)執(zhí)行過的去查找,查找到了就直接返回,不需要重新計算
      
     var fn=(function(){
        var cache={};//緩存對象
        var calc=function(arr){//計算函數(shù)
            var sum=0;
            //求和
            for(var i=0;i<arr.length;i++){
                sum+=arr[i];
            }
            return sum;
        }
         
        return function(){
            var args = Array.prototype.slice.call(arguments,0);//arguments轉(zhuǎn)換成數(shù)組
            var key=args.join(",");//將args用逗號連接成字符串
            var result , tSum = cache[key];
            if(tSum){//如果緩存有   
                console.log('從緩存中取:',cache)//打印方便查看
                result = tSum;
            }else{
                //重新計算,并存入緩存同時賦值給result
                result = cache[key]=calc(args);
                console.log('存入緩存:',cache)//打印方便查看
            }
            return result;
        }
     })();
    fn(1,2,3,4,5);
    fn(1,2,3,4,5);
    fn(1,2,3,4,5,6);
    fn(1,2,3,4,5,8);
    fn(1,2,3,4,5,6);

輸出結(jié)果:

以上就是js閉包的9個使用場景的詳細內(nèi)容,更多關(guān)于js 閉包使用場景的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一篇文章弄懂ECMAScript中的操作符

    一篇文章弄懂ECMAScript中的操作符

    這篇文章主要給大家介紹了如何通過一篇文章弄懂ECMAScript中操作符的相關(guān)資料,其中包括一元操作符、布爾操作符、乘性操作符、加性操作符、關(guān)系操作符、相等操作符、條件操作符、賦值操作符 以及逗號操作符,需要的朋友可以參考下
    2021-07-07
  • 使用透明效果來自定義文件上傳按鈕控件樣式

    使用透明效果來自定義文件上傳按鈕控件樣式

    處于安全上的考慮,input[type="file"] 的文件選擇按鈕樣式并不能隨意修改(不過可以修改input 的透明度),可能會跟設計師的設計格格不入,這時可以使用透明效果來自定義上傳按鈕
    2012-12-12
  • JS驗證日期的格式Y(jié)YYY-mm-dd 具體實現(xiàn)

    JS驗證日期的格式Y(jié)YYY-mm-dd 具體實現(xiàn)

    這篇文章介紹了JS對日期格式的驗證實例,有需要的朋友可以參考一下
    2013-06-06
  • js繪制圓形和矩形的方法

    js繪制圓形和矩形的方法

    這篇文章主要介紹了js繪制圓形和矩形的方法,涉及javascript鼠標事件及頁面元素樣式的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • JavaScript中object和Object的區(qū)別(詳解)

    JavaScript中object和Object的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄狫avaScript中object和Object的區(qū)別(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 7個Javascript地圖腳本整理

    7個Javascript地圖腳本整理

    7款JavaScript地圖腳本, 大多數(shù)都是基于Google地圖,也有使用jQuery實現(xiàn)的。
    2009-10-10
  • layui table表格數(shù)據(jù)的新增,修改,刪除,查詢,雙擊獲取行數(shù)據(jù)方式

    layui table表格數(shù)據(jù)的新增,修改,刪除,查詢,雙擊獲取行數(shù)據(jù)方式

    今天小編就為大家分享一篇layui table表格數(shù)據(jù)的新增,修改,刪除,查詢,雙擊獲取行數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 談談第三方App接入微信登錄 解讀

    談談第三方App接入微信登錄 解讀

    本篇文章主要介紹了談談第三方App接入微信登錄 解讀 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。
    2016-12-12
  • JavaScript去除字符串兩端空格的三種方法

    JavaScript去除字符串兩端空格的三種方法

    本文主要介紹了JavaScript去除字符串兩端空格的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • JS實現(xiàn)微信

    JS實現(xiàn)微信"炸屎"大作戰(zhàn)功能

    這篇文章主要介紹了JS實現(xiàn)微信 "炸屎"大作戰(zhàn),本文通過實例代碼圖文展示給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07

最新評論

贵港市| 高台县| 娱乐| 开封市| 福鼎市| 河池市| 濮阳县| 郴州市| 广饶县| 固始县| 通化市| 温州市| 磐安县| 乌拉特中旗| 大庆市| 西丰县| 三河市| 两当县| 临澧县| 白山市| 沐川县| 建始县| 化隆| 巴南区| 丹江口市| 林西县| 新丰县| 抚顺市| 德州市| 云南省| 临海市| 防城港市| 邯郸市| 轮台县| 宁德市| 甘谷县| 旌德县| 疏附县| 内丘县| 洪泽县| 桓台县|