[[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:GOc defined c.[[scope]] ===> 0 : bAO 2:GOc 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函數在返回之前就能夠執行呢?
立即執行函數,針對初始化功能的函數,
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+' '); } }(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中的作用域鍊與閉包相關影片:
以上是Javascript中作用域+閉包的詳細講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!