亚洲av午夜福利精品一区人妖,亚洲乱码日产精品a级毛片久久,91精品视频观看,青草青草久热精品视频在线观看

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

日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

亚洲av午夜福利精品一区人妖,亚洲乱码日产精品a级毛片久久,91精品视频观看,青草青草久热精品视频在线观看
<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • 欧美成人免费一级人片100| 欧美日韩免费一区| 这里只有精品在线播放| 在线播放日韩欧美| 国产一区自拍视频| 国产一区二区三区四区hd| 国产精品一区视频| 国产精品久久久一区二区三区| 欧美色偷偷大香| 欧美日韩中文在线观看| 欧美日韩国产成人在线免费 | 久久se精品一区精品二区| 欧美一二三视频| 久久电影一区| 免播放器亚洲一区| 欧美国产极速在线| 欧美日韩国产在线播放| 国产精品国产三级国产专区53| 国产精品久久久久9999| 国产日韩欧美综合| 亚洲第一黄色| 日韩一二三区视频| 亚洲一区二区在线免费观看视频 | 国内精品久久久久久久97牛牛| 国产欧美一区二区三区另类精品| 国产亚洲精品v| 亚洲国产精品悠悠久久琪琪 | 国产精品久久久久久久第一福利 | 国产一区二区三区网站| 在线免费精品视频| 一区电影在线观看| 欧美一区二区三区视频在线观看| 久久一区二区三区av| 欧美国产第一页| 欧美性猛交一区二区三区精品| 国产免费亚洲高清| 精品福利免费观看| 一本色道久久99精品综合| 小黄鸭精品aⅴ导航网站入口| 久久一区亚洲| 欧美日韩直播| 国内精品久久久久久| 亚洲精品免费在线观看| 亚洲免费小视频| 久久久最新网址| 欧美日韩精品伦理作品在线免费观看| 国产精品乱码久久久久久| 国语自产偷拍精品视频偷| 亚洲精品久久久久久久久久久久久 | 欧美国产精品中文字幕| 欧美日韩一区二区三区免费| 国产目拍亚洲精品99久久精品| 亚洲丰满在线| 午夜精品久久久久久久| 久热国产精品| 欧美亚日韩国产aⅴ精品中极品| 国产视频久久| 99视频精品全部免费在线| 欧美在线国产精品| 欧美乱大交xxxxx| 国产日韩欧美电影在线观看| 亚洲精品午夜| 久久九九久精品国产免费直播| 欧美日韩国产综合一区二区| 国产一区在线视频| 在线亚洲免费视频| 久久阴道视频| 国产精品你懂的在线欣赏| 亚洲激情视频网| 久久精品99国产精品酒店日本| 欧美破处大片在线视频| 国产综合色产在线精品| 亚洲一区二区三区四区中文| 欧美成人性生活| 国内精品嫩模av私拍在线观看| 一本色道婷婷久久欧美| 蜜臀av国产精品久久久久| 国产女人18毛片水18精品| 洋洋av久久久久久久一区| 美女被久久久| 国产一区二区三区网站| 亚洲一区二区成人| 欧美日韩国产不卡在线看| 亚洲高清成人| 久久婷婷激情| 国产一区二区三区在线观看视频| 亚洲一区二区三区四区五区黄| 欧美激情精品久久久久久变态 | 国产精品久久久久久av福利软件 | 欧美日韩日本国产亚洲在线| 黑人巨大精品欧美一区二区小视频| 亚洲天堂网在线观看| 欧美精品日本| 亚洲电影在线看| 久久天堂成人| 国产中文一区二区| 性色av一区二区三区在线观看| 欧美三区在线观看| 99精品国产福利在线观看免费 | 久久国产主播精品| 国产欧美1区2区3区| 亚洲一区二区3| 欧美日韩一级片在线观看| 亚洲三级国产| 欧美激情一区二区在线| 亚洲国产精品va在看黑人| 久久视频一区| 激情综合网址| 久久久亚洲国产美女国产盗摄| 国产一区二区精品在线观看| 欧美亚洲综合网| 国产婷婷色一区二区三区在线 | 亚洲尤物视频网| 欧美视频在线观看| 一区二区三区 在线观看视| 欧美日韩国产精品一区| 亚洲九九精品| 欧美人与禽性xxxxx杂性| 亚洲人成在线观看| 欧美精品一区二区在线观看| 亚洲精品自在久久| 欧美日韩高清区| 这里只有精品视频| 国产精品一区视频网站| 欧美一区91| 国内欧美视频一区二区| 久久午夜精品一区二区| 亚洲高清二区| 欧美日韩国产综合新一区| 一区二区欧美在线| 国产精品美女久久| 久久gogo国模裸体人体| 欧美日韩一区二区国产| 欧美日韩你懂的| 欧美日韩精品欧美日韩精品一| 狠狠色狠狠色综合日日tαg| 亚洲欧美国产视频| 国产精品成人免费视频| 日韩一级精品视频在线观看| 免费国产自线拍一欧美视频| 亚洲第一成人在线| 久久综合九九| 国产精品久久久久9999高清| 免费看成人av| 91久久国产综合久久| 久久综合国产精品台湾中文娱乐网| 在线看视频不卡| 欧美va亚洲va香蕉在线| 亚洲免费av网站| 国产精品久在线观看| 99re热精品| 欧美色另类天堂2015| 亚洲免费人成在线视频观看| 国产精品免费区二区三区观看| 一区二区三区在线观看视频| 亚洲欧洲一区二区三区在线观看| 免费亚洲电影| 亚洲欧洲午夜| 国产精品成人一区二区三区夜夜夜 | 国产精品成人av性教育| 亚洲一区中文| 黄色精品网站| 欧美日韩综合精品| 欧美在线播放| 亚洲国内精品| 国产精品日韩欧美一区| 久久久爽爽爽美女图片| 亚洲国产日韩在线| 国产精品嫩草99a| 久久午夜精品一区二区| a91a精品视频在线观看| 国产欧美一区二区色老头 | 欧美激情一区二区三区 | 国产视频在线一区二区| 免费观看一区| 亚洲一区二区视频| 尤物九九久久国产精品的特点| 欧美日韩在线播放| 久久久欧美精品| 亚洲天堂男人| 91久久久久久久久| 国产欧美午夜| 欧美日本在线视频| 午夜宅男久久久| 亚洲欧洲日韩女同| 国产深夜精品| 欧美三区美女| 蜜桃av综合| 午夜久久久久久| 亚洲人成人99网站| 国产亚洲va综合人人澡精品| 免费在线观看精品| 午夜精品短视频| 亚洲精品中文字幕女同| 国产主播一区二区三区| 欧美日韩一区二区在线观看视频| 久久久91精品国产一区二区三区| 制服丝袜激情欧洲亚洲| 在线成人亚洲| 国产一区二区无遮挡|