1. 程式人生 > >閉包 變數提升理解

閉包 變數提升理解

變數提升

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引用的時候,會被回收。