閉包
按中文的意思就是關上一個包的意思。如果我們把函數的作用域當做是一個包的話,那這個詞很形象體現了它的作用 。函數的正常的執(zhí)行流程是當函數中的語句執(zhí)行完后,程序會自動銷毀這個函數的作用域,但是當一個函數中聲明了另一個函數,并且這個子函數執(zhí)行時存在引用父函數的變量,就會形成閉包,形象點說就相當于把父函數的作用域給關閉了起來,不讓程序去銷毀它。
例如:
function a() { var name = "xuxu"; function b() { console.log(name); } // 此處產生閉包 b(); } a();
當函數可以記住并訪問它所在的作用域鏈時,就產生了閉包 當然,大部分的閉包都不是這么直觀的,因為子函數的調用是可以在父函數之外的,例如:
function a() { var name = "xuxu"; function b() { console.log(name); } return b; } var c=a(); // 此處產生閉包 此處的c函數其實就是a函數 c();
通過以上代碼,我們也可以看出一個閉包的好處,就是我們再全局作用域(此處是widow)下訪問到了局部作用域(a函數)的作用域的值,按正常的詞法作用域是無法這么做的,但是當我們使用閉包是就可以了。然后我們再看一點我們平時寫的比較多的:
function foo() { var a = 2; function baz() { // 2 console.log( a ); } bar( baz ); } function bar(fn) { // 大家快看呀,這就是閉包! fn(); }
又或者
var fn; function foo() { var a = 2; function baz() { console.log( a ); } // 將baz分配給全局變量 fn = baz; } function bar() { // 大家快看呀,這就是閉包! fn(); } foo(); // 2 bar();
以上也是閉包,因此在函數內部調用子函數,或者通過何種手段將內部函數傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執(zhí)行這個函數都會使用閉包。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com