jsp關於函數做用域之回調函數和閉包

要點:在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;作用域

相關文章
相關標籤/搜索