函式表示式 閉包

2021-08-06 07:14:23 字數 2059 閱讀 1214

有權訪問另乙個函式作用域內變數的函式。

常見的方式就是在乙個函式的內部建立另外乙個函式。

functiona()

b();

}a();

a內的b可以訪問a的內部變數color;

***:閉包只能取到包含函式中任何變數的的最後乙個值。
function

a();

}return arr;

}console.log(a()[0]())//10

console.log(a()[3]())//10

console.log(a()[8]())//10

上面的這個閉包內的函式,看起來是0位置的函式返回0,以此類推,其實不是。每乙個函式的作用域中都儲存著a()函式的活動物件,他們引用的是同乙個變數i,當a()執行結束,i返回為10,此時每乙個函式引用的變數i是同乙個變數物件,所以每乙個函式的內部i都是10.
可以利用下面的方式實現:

function

a();

}(i);

}return arr;

}console.log(a()[0]())//0

console.log(a()[3]())//3

console.log(a()[8]())//8

我們沒有直接將閉包賦值給陣列,而是定義了乙個匿名函式,並將立即執行該函式的結果賦值給陣列。(立即執行函式(function(num))(i)中的第二個()為呼叫函式,i為傳入的引數)。這樣就將不同的i賦值給了num,而在匿名函式的內部有返回乙個訪問num的閉包,這樣一來陣列arr中的每乙個元素所對應的的函式都有自己的num變數。
this是函式執行的環境所決定的,在全域性呼叫函式,this就是window。函式被當做某個物件的方法呼叫時,this就是這個物件。

不過,匿名函式的執行環境具有全域性性,因此this物件通常指向window。

var name = "this is window";

var obj = ;}};

obj.say()();//"this is window"

這是因為obj.say()其實是返回了匿名函式:

function();

然後又在全域性環境下呼叫了,所以this指向window。

也可以讓閉包訪問obj物件

var name = "this is window";

var obj = ;}};

obj.say()();//"opbject"

因為that指向的就是obj。

在某些特殊的環境下this會發生改變。

var name = "this is window";

var obj =

};obj.say();//"opbject"

(obj.say)();//"opbject"

因為this.name就是obj.name

(obj.say = obj.say)()//"this is window"

這是因為複製了函式,函式與obj沒有關係了,只是函式,在全域性環境下呼叫,所以this=window

如果閉包的作用域鏈儲存乙個html元素,就會造成記憶體洩漏。
functiona()

}

如果想**記憶體,那麼引用數需要可以減少為0,但是b在閉包內至少被引用了1回,導致記憶體無法**。
functiona()

b = null;

}

這樣就可以了,因為閉包會引用包含函式在內的活動物件,而變數b是活動物件的乙個屬性,所以任然會有乙個引用。

所以用必要將b=null

函式4 函式表示式 閉包

閉包 函式中的函式 用於獲取函式內部變數的函式 function a return b console.log info 報錯 info is not defined console.log a hello 在全域性作用域中,如果想訪問a函式中的變數info,直接訪問會報錯,因為a函式體是個作用域,...

函式表示式(1) 含閉包

定義函式的方法有兩種,一種是函式宣告,一種是函式表示式 函式宣告 function 函式表示式 他們兩個不同的地方在於,函式宣告會有乙個提公升 相當於會在執行 前讀取函式宣告 而函式表示式不會有 函式宣告 function 函式表示式 在函式表示式中,就像變數一樣,會被賦予undefined值,而不...

函式 函式表示式 作用域 閉包

var f function function f 函式宣告和函式表示式的主要區別是,函式宣告會被前置,而函式表示式作為變數,會被提公升。下方是js執行時的邏輯 前置和變數提公升 var f function f f function var f function function f f 上方 直...