閉包、做用域、做用域鏈

一 做用域,做用域鏈閉包

先上代碼app

1 var scope="global";  
2 function t(){  
3     console.log(scope);  
4     var scope="local"  
5     console.log(scope);  
6 }  
7 t();  

此時打印出來的 按順序分別是undefine,local,爲何第一個是undefined呢,摘抄下js做用域原話:函數

Javascript沒有塊級做用域,而是函數做用域.this

所謂函數做用域就是說:-》變量在聲明它們的函數體以及這個函數體嵌套的任意函數體內都是有定義的。spa

因此此段代碼就能夠解釋爲:code

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

因此明顯看出來第一句打印,只是從新聲明瞭變量,而沒有賦值對象

 

二 閉包與thisblog

在閉包中使用this對象會出現一些問題,this對象是運行時基於函數的執行環境綁定的:在全局函數中,this等於window,而當函數被看成某個對象的方法調用時,this等於那個對象。不過,匿名函數的執行環境具備全局性,所以其this對象一般指向window(固然,在經過call()和apply()改變函數執行環境時,this指向其餘對象)。ip

var name="The Window";  
    
var object={  
    name:"My object",  
    getNameFunc:function(){  
        return function(){  
            return this.name;  
            };  
        }  
    };  
alert(object.getNameFunc()()); //"The Window"(在非嚴格模式下)
此時彈出  The Window

若是要改變,那麼我本身的理解就是讓閉包能 根據活動函數上下文找到 外部函數的變量,那麼就把this從新賦值給一個變量內存

var name="The Window";  
    
var object={  
    name:"My object",  
    getNameFunc:function(){
      var that = this;
        return function(){  
            return that.name;  
            };  
        }  
    };  
alert(object.getNameFunc()()); //"The Window"(在非嚴格模式下)
此時彈出  My object

 

三 閉包的內存釋放與執行規則

直接上代碼

function fun03()  
      {  
          var a = 10;  
          return function(){  
              a*= 2 ;  
              return a ;  
          };  
      }  
  
      var f = fun03();  
      f();  
      var x = f();  
     console.log(x);  //40  
  
      var g = fun03();  
      var y = g();  
      console.log(y); //20 

爲何第一句打印的是40,第二句打印20呢,目測看到的緣由是第一句打印  f()執行了兩次(可是函數一旦執行後那麼裏面的局部變量就會銷燬,可是爲何沒有被銷燬呢,這就是閉包的做用)

由於閉包可使變量不被釋放,始終存在內存中,由於fun03是其中匿名函數(閉包)的父函數,而匿名函數又被賦值給了一個全局變量,因此f一直在內存中,而f又依賴於fun03因此這就致使其中的a變量一直存在,當運行兩次後a進行了累加計算

相關文章
相關標籤/搜索