閉包 變數提升理解
阿新 • • 發佈:2019-02-17
變數提升
var a="hello world"
function fun(){
console.log(a);
var a="hello nick"
console.log(a);
}
fun();
//第一個輸出是undefined 然後是 hello nick
因為這裡變數發生了提升 轉換後的代為為
var a="hello world";
function fun(){
var a;
console.log(a);
a="hello nick";
console.log(a)
}
閉包:能夠訪問函式內部變數的函式
為什麼要用:
1、便於程式碼的理解
2、減少全域性變數的宣告
3、保證鍵值對不隨上一級函式的執行完成而銷燬
function fun1(){
var n=1;
nadd=function(){
n+=1;
}
function fun2(){
console.log(n);
}
}
var result =fun1();
result();//1
nadd();
result();//2
1. var result=fun1(); 返回了一個函式f1, 因此result為f1。
2. result(); 呼叫fun2,顯然輸出1.
3. nAdd(); 這裡需要注意,這個nAdd實際上在定義的時候是一個lambda,是一個匿名函式,功能是n+=1。定義時將這個函式賦值給nAdd。所以在此時,實際上是呼叫了n+=1.為什麼能找到n?因為n在堆裡面。
4. result(); 呼叫f2,顯然輸出2.
最後一點,n在堆上如何被銷燬,這個工作是垃圾收集器負責。當n不在被任何閉包的env引用的時候,會被回收。