要點:在js中函數自身的做用域在聲明的地方不在調用的地方閉包
(1)回調函數jsp
1 var a = 1; 2 function f1(f2){ 3 var a = 2; 4 f2() 5 } 6
7 function f2(){ 8 console.log(a); 9 } 10
11 f1(f2);
控制檯輸出的是1;函數
由於f1(f2)裏面的f2是一個值,在f1裏面的f2()執行的時候 會在f1裏面尋找有沒有f2,沒有,那就會在全局做用域裏面去找f2,那麼執行的時候就是在全局做用域裏面執行,那就意味着f2裏面的a是全局做用域裏面的a,也就是1;spa
(2)閉包code
1 var a = 1; 2
3 function f1(){ 4 var a = 2; 5 function f2(){ 6 console.log(++a); 7 } 8 return f2; 9 } 10
11 var f = f1(); 12 f(); 13 f(); 14 f(); 15 f();
控制檯輸出的是3,4,5,6;blog
由於在jsp的解釋器中,當var f = f1()時;通常狀況下,當f1()執行到return的時候 證實函數已近運行結束,會銷燬局部變量a,可是f1()返回的是f2函數,爲了防止f2在調用的時候有可能會使用到f1裏面的局部變量,這時,jsp解釋器會將f1裏面的局部變量保留下來,以防萬一,因此在執行過一次f()後a裏面的值會變成3且沒有註銷。纔會輸出3,4,5,6;作用域