麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

javascript中的作用域和閉包詳解

2019-11-20 10:48:39
字體:
供稿:網(wǎng)友

一、JavaScript作用域

JavaScript變量實際上只有兩種作用域,全局變量和函數(shù)的內(nèi)部變量。在函數(shù)內(nèi)部任何一個地方定義的變量(var scope)其作用域都是整個函數(shù)體。
全局變量:指的是window對象下的對象屬性。
作用域劃分:基于上下文,以函數(shù)進行劃分的,而不是由塊劃分的。
強調(diào)兩點:
1. 在同一作用域中,JavaScript是允許變量的重復定義,并且后一個定義將覆蓋前一個定義。
2. 函數(shù)內(nèi)部如果不加關(guān)鍵字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" 

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

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

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

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

當使用var聲明一個變量時,創(chuàng)建的這個屬性是不可配置的,也就是說無法通過delete運算符刪除。
二、作用域?qū)嵗?/strong>

<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>

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

<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下面的所有l(wèi)i的對象數(shù)組     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); //調(diào)用tt函數(shù)       list_obj[i].onclick = col.clickFunc; //執(zhí)行clickFunc函數(shù)     }   </script> </body> </html> 

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 午夜久久久久 | 蜜桃精品视频 | 在线高清中文字幕 | 久久久久久久久淑女av国产精品 | 一级尻逼视频 | 亚洲综合精品 | 久久久久国产成人免费精品免费 | 久久精品亚洲精品国产欧美kt∨ | 丰满年轻岳中文字幕一区二区 | 一级视频在线播放 | 亚洲一区免费观看 | 欧美乱论 | 斗罗破苍穹在线观看免费完整观看 | 成人在线免费观看视频 | 悠悠成人资源亚洲一区二区 | 99re66热这里只有精品8 | 福利免费观看 | 国产精品久久久久久久亚洲按摩 | 午夜国产小视频 | 国产精品一区二区在线 | 亚洲综合无码一区二区 | 精品一区二区三区在线视频 | 成人精品免费在线观看 | 久久成年人视频 | 欧美成人性色区 | 最新午夜综合福利视频 | 在线播放免费播放av片 | 国产精品亚洲欧美 | 国产精品久久77777 | 一级美女大片 | 国产亚洲精品综合一区91 | 亚洲成人精品视频 | 久久中文免费 | 久久av免费 | 黄色高清av | 成人在线观看免费爱爱 | 国产免费永久在线观看 | 在线观看视频亚洲 | 精品久久久久久久久久中文字幕 | 欧美综合成人 | 91 免费视频 |