• <center id="sm46c"></center>
  • <dfn id="sm46c"></dfn>
  • <strike id="sm46c"></strike>
  • <cite id="sm46c"><source id="sm46c"></source></cite>
    • <strike id="sm46c"><source id="sm46c"></source></strike>
      <option id="sm46c"></option>
      国产精品天天看天天狠,女高中生强奷系列在线播放,久久无码免费的a毛片大全,国产日韩综合av在线,亚洲国产中文综合专区在,特殊重囗味sm在线观看无码,中文字幕一区二区三区四区在线,无码任你躁久久久久久老妇蜜桃

      JS作用域、立即執行函數、閉包

      2018-4-25    seo達人

      如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

      作用域    

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

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

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

      作用域鏈 : [[scope]] 中所存儲的執行期上下文對象的集合,這個集合呈鏈式鏈接,我們把這種鏈接叫做作用域鏈。

      運行期上下文  : 當函數執行時,會創建一個稱為執行期上下文的內部對象(AO)。一個執行期上下文定義了一個函數執行的環境,函數每次執行時對應的執行環境都是的,所以多次調用一個函數會導致創建多個執行上下文,當函數執行完畢,它所產生的執行上下文被銷毀。

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

      下面舉一些例子:

      [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定義的時候產生GO對象  
      14. a doing   a.[[scope]] ----> 0 : aAO           //a執行的時候新產生AO對象  
      15.                             1 : GO  
      16.   
      17. b defined  b.[[scope]] ----> 0 : aAO            //子級b定義會繼承父級a運行時產生的對象  
      18.                              1 : GO   
      19. b doing    b.[[scope]] ---->  0 : bAO            //子級b新產生AO對象  
      20.                               1 : aAO   
      21.                               2 : GO   
      22.                                 
      23. c defined  c.[[scope]] ---->  0 : bAO            //c定義時會繼承b運行時產生的屬性  
      24.                               1 : aAO   
      25.                               2 : GO                          
      26. c doing     c.[[scope]] ----> 0 : cAO            //c執行時同時又產生新的AO  
      27.                               1 ;bAO   
      28.                               2 : aAO   
      29.                               3 : GO   

      立即執行函數

      之前學過函數的定義、函數表達式,還有一種函數叫做立即執行函數。

      立即執行函數:函數執行過后立即被銷毀。

      立即執行函數的官方寫法:

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

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

      [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. }())  

      只有表達式才能被執行符號執行,能被執行符號執行的表達式,函數名字會被自動忽略。

      [html] view plain copy
      1. function test(){  
      2.     console.log("a");  
      3. }()    會出現語法解析錯誤,因為括號前面是函數聲明  
      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. // 不報錯也沒有執行        

      下面是幾道經典的例題,可以參考一下:

      [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  

      那么采用立即執行函數呢?會有怎樣的結果呢?

      [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. // 輸出結果  0 1 2 3 4 5 6 7 8 9   

      大家可以自行思考一下。

      閉包

      閉包的現象:當內部函數保存到外部時會產生閉包。


      閉包會導致原有的作用域鏈不釋放,造成內存泄漏

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


      閉包觸發的情況:

          兩個或多個函數互相嵌套,把里面的函數保存到外部,這樣的情況一定會產生閉包。從外面還可以調用里面的函數。


      閉包的作用:

                  實現公有變量

                          eg:函數累加器

                  可以做緩存(存儲結構)

                          eg:eater

                     可以實現封裝,屬性私有化

                          eg:person()

                      模塊化開發,防止污染全局變量



      [html] view plain copy
      1. // 函數累加器  
      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();  

      附加一個逗號操作符:

              先看前面的表達式,再看后面的表達式,把后面表達式的計算結構返回

      例題:

      [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. 藍藍設計www.li-bodun.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

      日歷

      鏈接

      個人資料

      藍藍設計的小編 http://www.li-bodun.cn

      存檔

      主站蜘蛛池模板: 亚洲一区二区精品偷拍| 国产成人精品三级在线影院| 国产精品国产三级国产a| 爱性久久久久久久久| 麻豆国产成人AV在线播放| 国产乱码精品一区二区上| 久久9精品区-无套内射无码| 三级三级三级A级全黄| 久久精品国产亚洲AV麻| 日韩人妻一区中文字幕| 大学生久久香蕉国产线看观看| 农村熟女大胆露脸自拍| 中文字幕永久精品国产| 日韩欧美国产成人| 99精品久久99久久久久| 精品免费看国产一区二区| 成年午夜性影院| 中文字幕日产乱码一区| 一级毛片免费观看不卡视频| 久久精品国产亚洲AV麻| 一本一本久久A久久精品综合不卡| 呦系列视频一区二区三区| 久久亚洲国产成人亚| 国产精品丝袜在线| 久99久热免费视频播放| 午夜成人影片av| 丁香色婷婷国产精品视频| 色欲天天天无码视频| 色综合AV综合无码综合网站| 久久综合亚洲色一区二区三区| 国产99页| 国模无吗一区二区二区视频| 国产色秀视频在线播放| 国产人妻精品无码av在线| 嫩草院一区二区乱码| 人人妻人人澡人人爽| 午夜肉伦伦影院| 国产精品内射久久久久欢欢| 亚洲成vr人片在线观看天堂无码| 天天激情综合| 精品人妻av区乱码|