一 作用域,作用域鏈
先上代碼
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作用域原話:
所謂函數作用域就是說:-》變量在聲明它們的函數體以及這個函數體嵌套的任意函數體內都是有定義的。
所以此段代碼就可以解釋為:
var scope="global"; function t(){ var scope; console.log(scope); scope="local" console.log(scope); } t();所以明顯看出來第一句打印,只是重新聲明了變量,而沒有賦值
二 閉包與this
在閉包中使用this對象會出現一些問題,this對象是運行時基于函數的執行環境綁定的:在全局函數中,this等于window,而當函數被當作某個對象的方法調用時,this等于那個對象。不過,匿名函數的執行環境具有全局性,因此其this對象通常指向window(當然,在通過call()和apply()改變函數執行環境時,this指向其他對象)。
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進行了累加計算
結合垃圾回收機制來理解作用域鏈
|
新聞熱點
疑難解答