JS函式(二)閉包

2021-08-26 05:46:08 字數 1389 閱讀 5190

有不少開發人員總是搞不清匿名函式和閉包這兩個概念,因此經常混用。閉包是指有權訪問另乙個函式作用域的變數的函式。建立閉包的常見方式,就是在乙個函式內部建立另乙個函式。

function

createcomparisonfunction

(propertyname)else

if(value1>value2)else};}

在這個例子中,value1和value2這兩行**是內部函式(乙個匿名函式)中的**,這兩行**訪問了外部函式中的變數propertyname。即使這個內部函式被返回了,而且是在其他地方被呼叫了,但它仍然可以訪問變數propertyname。之所以還能夠訪問這個變數,是因為內部函式的的作用域鏈中包含createcomparisonfunction()的作用域。要徹底搞清楚其中的細節,必須從理解函式被呼叫的時候都會發生什麼入手。

當某個函式被呼叫時,會建立乙個執行環境及相應的作用域鏈。然後,使用arguments和其他命名引數的值來初始化函式的活動物件。但在作用域鏈中,外部函式的活動物件始終處於第二位,外部函式的外部函式的活動物件處於第三位,·····直至作為作用域終點的全域性執行環境。

在函式執行過程中,為讀取和寫入變數的值,就需要在作用域鏈中查詢變數。來看下面的例子。

function

compare

(value1,value2)else

if(value1>value2)else

}var result=compare(5,10);

以上**先定義了compare()函式,然後又在全域性作用域中呼叫了它。當呼叫compare()時,會建立乙個包含arguments、value1和value2的活動物件。全域性執行環境的變數物件(包含result和compare)在compare()執行環境的作用域中則處於第二位。圖7-1展示了包含上述關係的compare()函式執行時的作用域鏈

圖7-1

後台的每個執行環境都有乙個表示變數的物件——變數物件。全域性環境的變數物件始終存在,而像compare()函式這樣的區域性環境的變數物件,則只在函式執行的過程中存在。在建立compare()函式時,會建立乙個預先包含全域性變數物件的作用域鏈,這個作用域鏈被儲存在內部的[[scope]]屬性中。當呼叫compare()函式時,會為函式建立乙個執行環境,然後通過複製函式的[[scope]]屬性中的物件構建起執行環境的作用域鏈。此後,又有乙個活動物件(在此作為變數物件使用)被建立並被推入執行環境作用域鏈的前端。對於這個例子中compare()函式的執行環境而言,其作用域鏈中包含兩個變數物件:本地活動物件和全域性變數物件。顯然,作用域鏈本質上是乙個指向變數物件的指標列表,它只引但不實際包含變數物件。

js函式閉包

閉包的好處 希望乙個變數長期駐紮在記憶體當中 避免全域性變數的汙染 私有成員的存在 舉例 function f1 x var b f1 2 x 2 b 10 相當於b f2 b f2 故y 10 匿名函式 function 該方法經常在全域性作用域中被用在函式外部,從而限制向全域性作用域中新增過多的...

Js函式閉包

一 什麼是閉包 1.定義 如果在乙個內部函式裡,對在外部作用域 但不是全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包。2.如何建立閉包 常見方式 在乙個函式內部建立另乙個函式。例 function createcomparsionfunction propertyname else if ...

JS函式閉包

閉包指的是那些引用了另乙個函式作用域中變數的函式,通常是在巢狀函式中實現的。函式執行時,每個執行上下文中都會有乙個包含其中變數的物件。全域性上下文中的叫變數物件,它會在 執行期間始終存在。而函式區域性上下文中的叫活動物件,只在函式執行期間存在。在定義函式時,就會為它建立作用域鏈,預裝載全域性變數物件...