国产精品美女久久久浪潮AV,国产精品三级一二三区,久久精品国产一区二区小说 ,依依成人影视国产精品,全部无卡免费的毛片在线看,日本一区二区三深夜不卡,国产精品女同一区二区久久,国产精品夜色一区二区三区

        JS作用域、立即執(zhí)行函數(shù)、閉包

        2018-4-25    seo達(dá)人

        如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點這里

        作用域    

        首先先介紹一下作用域等一些基礎(chǔ)概念。

         每個JavaScript函數(shù)都是一個對象,對象中有些屬性我們可以訪問,但有些不可以,這些屬性僅供JavaScript引擎存取,[[scope]]就是其中一個。

        [[scope]] : 指的就是我們所說的作用域,其中存儲了執(zhí)行期上下文的集合

        作用域鏈 : [[scope]] 中所存儲的執(zhí)行期上下文對象的集合,這個集合呈鏈?zhǔn)芥溄樱覀儼堰@種鏈接叫做作用域鏈。

        運行期上下文  : 當(dāng)函數(shù)執(zhí)行時,會創(chuàng)建一個稱為執(zhí)行期上下文的內(nèi)部對象(AO)。一個執(zhí)行期上下文定義了一個函數(shù)執(zhí)行的環(huán)境,函數(shù)每次執(zhí)行時對應(yīng)的執(zhí)行環(huán)境都是的,所以多次調(diào)用一個函數(shù)會導(dǎo)致創(chuàng)建多個執(zhí)行上下文,當(dāng)函數(shù)執(zhí)行完畢,它所產(chǎn)生的執(zhí)行上下文被銷毀。

        查找變量  :從作用域鏈的頂端依次向下查找。

        下面舉一些例子:

        [html] view plain copy
        1. function a(){  
        2.     function b(){  
        3.         function c(){  
        4.   
        5.         }  
        6.         c();  
        7.     }  
        8.     b();  
        9. }  
        10. a();  
        11.   
        12.   
        13. a defined a.[[scope]] ----> 0 : GO          //a定義的時候產(chǎn)生GO對象  
        14. a doing   a.[[scope]] ----> 0 : aAO           //a執(zhí)行的時候新產(chǎn)生AO對象  
        15.                             1 : GO  
        16.   
        17. b defined  b.[[scope]] ----> 0 : aAO            //子級b定義會繼承父級a運行時產(chǎn)生的對象  
        18.                              1 : GO   
        19. b doing    b.[[scope]] ---->  0 : bAO            //子級b新產(chǎn)生AO對象  
        20.                               1 : aAO   
        21.                               2 : GO   
        22.                                 
        23. c defined  c.[[scope]] ---->  0 : bAO            //c定義時會繼承b運行時產(chǎn)生的屬性  
        24.                               1 : aAO   
        25.                               2 : GO                          
        26. c doing     c.[[scope]] ----> 0 : cAO            //c執(zhí)行時同時又產(chǎn)生新的AO  
        27.                               1 ;bAO   
        28.                               2 : aAO   
        29.                               3 : GO   

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

        之前學(xué)過函數(shù)的定義、函數(shù)表達(dá)式,還有一種函數(shù)叫做立即執(zhí)行函數(shù)。

        立即執(zhí)行函數(shù):函數(shù)執(zhí)行過后立即被銷毀。

        立即執(zhí)行函數(shù)的官方寫法:

        [html] view plain copy
        1. // 立即執(zhí)行函數(shù)的官方寫法  
        2. (function() {} ());  W3C建議此種  
        3. (function() {})();  

        針對初始化功能的函數(shù),可以有參數(shù)。

        [html] view plain copy
        1. var num = function (a,b){  
        2.     return a + b;  
        3. }(1,2);  
        4.   
        5. (function abc(){  
        6.     var a = 123;  
        7.     var b = 234;  
        8.     console.log(a+b);  
        9. }())  

        只有表達(dá)式才能被執(zhí)行符號執(zhí)行,能被執(zhí)行符號執(zhí)行的表達(dá)式,函數(shù)名字會被自動忽略。

        [html] view plain copy
        1. function test(){  
        2.     console.log("a");  
        3. }()    會出現(xiàn)語法解析錯誤,因為括號前面是函數(shù)聲明  
        4.   
        5. (+ function test( ){  
        6.     console.log('a');  
        7. }())                    -------->打印出a  

        下面是一道曾阿里面試題

        [html] view plain copy
        1. function test(a, b, c, d){  
        2.     console.log(a + b + c + d);  
        3. }(1, 2, 3, 4);  
        4.   
        5. // 不報錯也沒有執(zhí)行        

        下面是幾道經(jīng)典的例題,可以參考一下:

        [html] view plain copy
        1.   
        [html] view plain copy
        1. function test(){  
        2.     var arr = [];  
        3.     for(var i = 0; i < 10; i ++){  
        4.         arr[i] = function (){  
        5.             console.log(i);  
        6.         }  
        7.     }  
        8.     return arr;  
        9. }  
        10. var myArr = test();  
        11. for(var j = 0; j < 10; j++){  
        12.     myArr[j]();  
        13. }    
        [html] view plain copy
        1.   
        [html] view plain copy
        1. // 輸出:10個10  

        那么采用立即執(zhí)行函數(shù)呢?會有怎樣的結(jié)果呢?

        [html] view plain copy
        1. function test(){  
        2.     var arr = [];  
        3.     for(var i = 0; i < 10; i ++){  
        4.         (function(j){  
        5.             arr[i] = function (){  
        6.             console.log(j + " ");  
        7.         }  
        8.         }(i))  
        9.     }  
        10.     return arr;  
        11. }  
        12. var myArr = test();  
        13. for(var j = 0; j < 10; j++){  
        14.     myArr[j]();  
        15. }   
        [html] view plain copy
        1.   
        [html] view plain copy
        1. // 輸出結(jié)果  0 1 2 3 4 5 6 7 8 9   

        大家可以自行思考一下。

        閉包

        閉包的現(xiàn)象:當(dāng)內(nèi)部函數(shù)保存到外部時會產(chǎn)生閉包。


        閉包會導(dǎo)致原有的作用域鏈不釋放,造成內(nèi)存泄漏

        (內(nèi)存泄漏:內(nèi)存占用(比如:手握沙子,握得越緊手里剩得就越少))


        閉包觸發(fā)的情況:

            兩個或多個函數(shù)互相嵌套,把里面的函數(shù)保存到外部,這樣的情況一定會產(chǎn)生閉包。從外面還可以調(diào)用里面的函數(shù)。


        閉包的作用:

                    實現(xiàn)公有變量

                            eg:函數(shù)累加器

                    可以做緩存(存儲結(jié)構(gòu))

                            eg:eater

                       可以實現(xiàn)封裝,屬性私有化

                            eg:person()

                        模塊化開發(fā),防止污染全局變量



        [html] view plain copy
        1. // 函數(shù)累加器  
        2. function add(){  
        3.     var count = 0;  
        4.     function demo(){  
        5.         count ++;  
        6.         console.log(count);  
        7.     }  
        8.     return demo;  
        9. }  
        10. var counter = add();  
        11. counter();  
        12. counter();  
        13. counter();  
        14. counter();  
        15. counter();  
        16. counter();  
        17.   
        18.   
        19. // eater  
        20. function test(){  
        21.     var food = "apple";  
        22.     var obj = {  
        23.         eatFood : function (){  
        24.             if(food != ""){  
        25.                 console.log("I am eating  " + food);  
        26.                 food = "";  
        27.             }  
        28.             else{  
        29.                 console.log("There is nothing!");  
        30.             }  
        31.         },  
        32.         pushFood : function (myFood){  
        33.             food = myFood;  
        34.         }  
        35.     }  
        36.     return obj;  
        37. }  
        38. var person = test();  
        39. person.eatFood();  
        40. person.eatFood();  
        41. person.pushFood('banana');  
        42. person.eatFood();  

        附加一個逗號操作符:

                先看前面的表達(dá)式,再看后面的表達(dá)式,把后面表達(dá)式的計算結(jié)構(gòu)返回

        例題:

        [html] view plain copy
        1. var f =(  
        2.     function f(){  
        3.         return "1";  
        4.     },  
        5.     function g(){  
        6.         return 2;  
        7.     }  
        8. )();  
        9. console.log(typeof(f));   
        10.   
        11. // -------number  
        12.   
        13. var x = 1;  
        14. if(function f(){}){  
        15.     x += typeof f;  
        16. }  
        17. console.log(x);  
        18. // --------> 1undefined  
        19. 藍(lán)藍(lán)設(shè)計www.shtzxx.cn )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)

        日歷

        鏈接

        個人資料

        存檔

        主站蜘蛛池模板: 兰州市| 好男人在线社区www在线播放 | 三年片中国在线观看免费大全| 国精产品999国精产品视频| caoporn免费视频公开| 久久日韩乱码一二三四区别| 亚洲va在线va天堂xx xx| 曰韩无码av一区二区免费| 成人a级视频在线观看| 国产zzjjzzjj视频全免费| 欧美人与zoxxxx另类| 最美情侣免费视频观看 | 三年片观看免费观看大全| 国产精品天堂avav在线| 国产精品亚洲综合久久系列| 中文字幕人妻色偷偷久久| 区。| 天天爽天天狠久久久综合麻豆| 一二三四在线播放视频国语高清观看 | 人妻japan hd xxxx videos| 99视频精品全部免费 在线| 欧洲尺码日本尺码专线美国又| 美女裸体无遮挡免费视频网站| 五月丁香六月综合缴清无码| 亚洲同志gay片可播放| 成年女人a毛片免费视频| 亚洲熟妇无码爱v在线观看| 亚洲日产欧| 国产乱人伦av麻豆网| 人妻妺妺窝人体色www聚色窝| 巴里| 国产真人无遮挡作爱免费视频| 巧家县| 国产v综合v亚洲欧美久久| 隆林| 鹿泉市| 津南区| 清水河县| 佛学| 亚洲国产av玩弄放荡人妇系列| 真实国产乱子伦对白视频|