首頁 >web前端 >js教程 >Javascript中作用域+閉包的詳細講解

Javascript中作用域+閉包的詳細講解

php是最好的语言
php是最好的语言原創
2018-08-04 10:45:072564瀏覽

作用域:

[[scope]]:每一個javascript函數都是一個對象,物件中有些屬性我們可以訪問,但是有些不可以,這些屬性僅供JavaScript引擎訪問,[[scope]]就是其中一個。

[[scope]]指的就是我們所說的作用域,其中儲存了運行期上下文的集合。運行期上下文:當函數執行時,會建立一個稱為執行期上下文的內部對象,一個執行期上下文定義了一個函數執行時的環境,函數每次執行時對應的執行期上下文都是獨一無二的,所以多次呼叫一個函數會導致建立多個執行期上下文,當函數執行完畢,它所產生的執行期上下文就會被銷毀。

作用域鏈:[[scope]]中所儲存的執行期上下文物件的集合,這個集合呈現鍊式連接,我們把這種鍊式連結叫做作用域。

function a(){
    function b(){
        function c(){
        }
    }    

}

a defined a.[[scope]]  ===> 0: GO

a doing a.[[scope]]  ===> 0: aAO

                                                     時                               1:GO

b defined b.[ scope]]  ===> 0: bAO

##                                                              2:GO

c defined c.[[scope]]  ===> 0 : bAO

                                                            2:GO

c defined c.[[scope]]  ===> 0: cAO

         1 :bAO

                                                           3:GO

閉包

當內部函數儲存到外部時,將會產生閉包,閉包會導致原有作用域鏈不釋放,造成記憶體外洩。

function a(){
    function b(){
        var bbb = 234;
           console.log(aaa);
    }
    var aaa = 123;
    return b;
}
var glob = 100;
var demo = a();
demo();

a函數被銷毀前傳回了b函數,所以b函數所產生的作用域鏈並沒有被銷毀,並且此時b函數並沒有被執行,在下面demo()呼叫的時候console.log(aaa)時,執行b函數,bAO中沒有變數aaa,所以返回父級aAO中尋找到aaa = 123,故結果為123.

那麼,怎麼讓b函數在返回之前就能夠執行呢?

引入

立即執行函數

立即執行函數,針對初始化功能的函數,Javascript中作用域+閉包的詳細講解

1.(function(){}()); (w3c建議第一種)

2.(function(){})();

只有表達式才能被執行符號執行

#立即執行符號執行的函數表達式後函數不能再次使用

可透過加號,減號等將函數轉換為函數表達式

/-/! function test(){

        console.log('a'); 

}     

function test(){
    var arr = [];
    for(var i = 0;i < 10;i ++){
        (function (j){
            arr[j] = function(){
                document.write(j+&#39; &#39;);    
            }
        }(i));
    }
    return arr;
	}
	var myarr = test();
	for(var i = 0;i < 10;i ++){
   	     myarr[i]();
    }

輸出結果為:1 2 3 4 5 6 7 8 9 

##rrreee

##相關文章:

詳解JavaScript作用域與閉包

#JavaScript中的作用域鍊與閉包

相關影片:

JS進階之作用域-燕十八 Javascript進階影片教學

以上是Javascript中作用域+閉包的詳細講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn