亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript中的作用域和閉包詳解

2019-11-20 10:48:39
字體:
來源:轉載
供稿:網友

一、JavaScript作用域

JavaScript變量實際上只有兩種作用域,全局變量和函數的內部變量。在函數內部任何一個地方定義的變量(var scope)其作用域都是整個函數體。
全局變量:指的是window對象下的對象屬性。
作用域劃分:基于上下文,以函數進行劃分的,而不是由塊劃分的。
強調兩點:
1. 在同一作用域中,JavaScript是允許變量的重復定義,并且后一個定義將覆蓋前一個定義。
2. 函數內部如果不加關鍵字var而定義的變量,默認為全局變量。

var scope="global"; function t(){   console.log(scope); //"global"   scope="local"   console.log(scope); //"local" } t(); console.log(scope); //"local" var scope="global"; function t(){   console.log(scope); //"undefined"   var scope="local"   console.log(scope); //"local" } t(); console.log(scope); //"global" 

在變量解析過程中首先查找局部的作用域,然后查找上層作用域。在第一段代碼的函數當中沒有定義變量scope,于是查找上層作用域(全局作用域),進而進行輸出其值。但是在第二段代碼的函數內定義了變量scope(無論是在console之后還是之前定義變量,都認為在此作用域擁有變量scope),于是不再向上層的作用域進行查找,直接輸出scope。但是不幸的是此時的局部變量i并沒有賦值,所以輸出的是undefined。

//所以根據函數作用域的意思,可以將上述第二段代碼重寫如下: var scope="global"; function t(){   var scope;   console.log(scope);   scope="local"   console.log(scope); } t(); 

由于函數作用域的特性,局部變量在整個函數體始終是由定義的,我們可以將變量聲明”提前“到函數體頂部。

var b; //第1步 function fun(){    b = "change";  }  alert(b);//輸出undefined,由于第1步只定義未賦值   var b; //第1步 function fun(){    b = "change";  } fun(); //調用上述函數 alert(b); //輸出change 

當使用var聲明一個變量時,創建的這個屬性是不可配置的,也就是說無法通過delete運算符刪除。
二、作用域實例

<html> <head>   <script type="text/javascript">     function buttonInit(){       for(var i=1;i<4;i++){         var b=document.getElementById("button"+i);         b.addEventListener("click",function(){ alert("Button"+i);},false);       }     }     window.onload=buttonInit;   </script> </head> <body>   <button id="button1">Button1</button>   <button id="button2">Button2</button>   <button id="button3">Button3</button> </body> </html>

當注冊事件結束后,i的值為4,當點擊按鈕時,事件函數即function(){ alert("Button"+i);}這個匿名函數中沒有i,根據作用域鏈,所以到buttonInit函數中找,此時i的值為4,所以彈出”button4“。
三、javaScript閉包
在js中,閉包主要涉及到js的幾個其他的特性:作用域鏈,垃圾(內存)回收機制,函數嵌套,等等。
1. 作用域鏈:簡單來說,作用域鏈就是函數在定義的時候創建的,用于尋找使用到的變量的值的一個索引,而他內部的規則是,把函數自身的本地變量放在最前面,把自身的父級函數中的變量放在其次,把再高一級函數中的變量放在更后面,以此類推直至全局對象為止。當函數中需要查詢一個變量的值的時候,js解釋器會去作用域鏈去查找,從最前面的本地變量中先找,如果沒有找到對應的變量,則到下一級的鏈上找,一旦找到了變量,則不再繼續。如果找到最后也沒找到需要的變量,則解釋器返回undefined。
2. Javascript的垃圾回收機制:在Javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收。如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。因為函數a被b引用,b又被a外的c引用,這就是為什么函數a執行后不會被回收的原因。構建一個閉包,這些變量將不會被內存回收器所回收,只有當內部的函數不被調用以后,才會銷毀這個閉包,而沒有任何一個閉包引用的變量才會被下一次內存回收啟動時所回收。
3. 有了閉包,嵌套的函數結構才可以運作
四、利用js閉包實現循環綁定事件

<html> <head>   <title>閉包</title> </head> <body>   <ul id="list">     <li>第1條記錄</li>     <li>第2條記錄</li>     <li>第3條記錄</li>     <li>第4條記錄</li>     <li>第5條記錄</li>     <li>第6條記錄</li>   </ul>   <script type="text/javascript">     function tt(nob) {       this.clickFunc = function() {         alert("這是第" + (nob + 1) + "記錄");       }     }     var list_obj = document.getElementById("list").getElementsByTagName("li"); //獲取list下面的所有li的對象數組     for (var i = 0; i<= list_obj.length; i++){       console.log(list_obj[i])       list_obj[i].onmousemove = function(){         this.style.backgroundColor = "#cdcdcd";       }       list_obj[i].onmouseout = function() {         this.style.backgroundColor = "#FFFFFF";       }       //list_obj[i].onclick = function() {       // alert("這是第" + i + "記錄"); //不能正常獲取 alert出來的都是:“這是第6記錄”       //}       var col = new tt(i); //調用tt函數       list_obj[i].onclick = col.clickFunc; //執行clickFunc函數     }   </script> </body> </html> 

以上就是本文的全部內容,希望對大家學習javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品丝袜一区二区三区| 97av在线视频| 成人精品在线观看| 久久免费国产视频| 亚洲xxxx18| 欧美日韩加勒比精品一区| 久久九九全国免费精品观看| 91中文在线视频| 日本欧美一二三区| 神马久久桃色视频| 91亚洲精品久久久| 欧美在线一区二区视频| 国产精品一二三视频| 国产欧美日韩精品在线观看| 欧美性生交xxxxx久久久| 日韩精品免费综合视频在线播放| 久久久爽爽爽美女图片| 亚州欧美日韩中文视频| 欧美黑人极品猛少妇色xxxxx| 欧美小视频在线| 一本大道亚洲视频| 欧美成年人视频网站欧美| 日韩影视在线观看| 国产色婷婷国产综合在线理论片a| 久久伊人91精品综合网站| 亚洲aaa激情| 亚洲精品国产精品国自产在线| 久久精品电影网| 欧美激情影音先锋| 日产精品99久久久久久| 中文字幕亚洲一区| 日韩av色在线| 国产深夜精品福利| 这里只有精品久久| 日韩欧美在线中文字幕| 亚洲欧美在线看| 亚洲精品国产精品国自产在线| 久久偷看各类女兵18女厕嘘嘘| 国产精品视频成人| 国产精品入口免费视| 亚洲精品在线观看www| 青青精品视频播放| 欧美精品激情在线观看| 中日韩午夜理伦电影免费| 日韩av在线一区| 久久中文久久字幕| 国产精品老女人视频| 国产精品久久久久久久午夜| 久久综合免费视频| 久久国产精品久久久久久久久久| 国产综合视频在线观看| 国产精品成av人在线视午夜片| 91高潮精品免费porn| 国产精品男女猛烈高潮激情| 成人美女免费网站视频| 亚洲欧美日韩成人| 国产精品久久久久久久av电影| 97在线视频免费| 欧美精品videosex性欧美| 精品国内产的精品视频在线观看| 疯狂蹂躏欧美一区二区精品| 久久综合色影院| 久久综合免费视频影院| 九九精品视频在线| 久久久女人电视剧免费播放下载| 国产欧美一区二区三区视频| 久久久久久久久久久人体| 92看片淫黄大片看国产片| 在线看日韩欧美| 国产欧美日韩最新| 欧美日韩另类视频| 日韩免费视频在线观看| 91天堂在线观看| 91高潮精品免费porn| 91美女片黄在线观| 日韩av电影在线播放| 国产精品91在线| 91中文字幕在线观看| 亚洲欧美999| 国产亚洲精品美女久久久久| 国产亚洲美女久久| 欧洲美女7788成人免费视频| 欧美第一页在线| 色一区av在线| 欧洲成人午夜免费大片| 国产成人精品免费久久久久| 成人精品久久久| 亚洲国产古装精品网站| 欧美成人第一页| 亚洲精品91美女久久久久久久| 色婷婷av一区二区三区在线观看| 中文字幕在线看视频国产欧美| 欧美成人精品不卡视频在线观看| 热久久免费国产视频| 黑人巨大精品欧美一区二区免费| 国产精品永久免费在线| 91精品国产色综合久久不卡98口| 国产精品成人aaaaa网站| 亚洲偷欧美偷国内偷| 亚洲欧美日韩一区二区在线| 亚洲性日韩精品一区二区| 欧美在线观看网址综合| 国产精品成人aaaaa网站| 日韩中文字幕网| 亚洲va久久久噜噜噜久久天堂| 国产美女精品免费电影| 亚洲aaa激情| 777午夜精品福利在线观看| 亚洲社区在线观看| 日本国产精品视频| 日韩视频永久免费观看| 91免费视频网站| 国产精品最新在线观看| 久热在线中文字幕色999舞| 亚洲国产精品资源| 97久久超碰福利国产精品…| 亚洲精品自拍偷拍| 国产精品亚洲欧美导航| 欧美孕妇与黑人孕交| 亚洲欧美制服综合另类| 中文字幕亚洲综合久久筱田步美| 日本精品视频在线| 亚洲一区免费网站| 成人午夜在线视频一区| 欧美大片欧美激情性色a∨久久| 国产成人福利网站| 日韩av一区在线观看| 国产91精品久久久久久| 亚洲少妇激情视频| 国产精品久久久av| 欧美大尺度在线观看| 亚洲嫩模很污视频| 欧美性开放视频| 最好看的2019的中文字幕视频| 免费av一区二区| 国产精品爽爽ⅴa在线观看| 久久理论片午夜琪琪电影网| 国产精品三级在线| 国产精品白丝jk喷水视频一区| 国产亚洲视频在线观看| 日韩亚洲欧美成人| 2019国产精品自在线拍国产不卡| 久久久久久久999精品视频| 国a精品视频大全| 亚洲a级在线播放观看| 久久久久这里只有精品| 国产69精品久久久久99| 九九热视频这里只有精品| 欧美成人精品不卡视频在线观看| 少妇久久久久久| 久久久精品视频在线观看| 亚洲第一福利视频| 亚洲欧洲午夜一线一品| 国产成人精品亚洲精品| 亚洲a一级视频| 国产福利精品av综合导导航| 9.1国产丝袜在线观看| 国产日本欧美在线观看| 668精品在线视频| 亚洲一区二区三区xxx视频| 成人国产精品日本在线| 一本色道久久综合亚洲精品小说| 91沈先生作品| 国产日韩欧美日韩大片|