js閉包的學習(一)

2021-09-02 13:15:54 字數 939 閱讀 3877

學習js就無法避免的要學習到閉包這個概念,而學習閉包之前理解好作用域和作用域鏈是很有幫助的。

作用域:

對於變數的作用域每個人都不會陌生,而根據作用域則有了所謂的全域性變數和區域性變數。

下面是一段**:

function test (value) 

console.log(k)

}console.log(j)

console.log(i)

}

他們的輸出是什麼樣子呢

第乙個k的輸出 是數字 0 ~ 9 

第二個k的輸出 是 10

j輸出是 undefined

i輸出是 0

js的函式作用域是指在函式內宣告的所有變數在函式體內是始終可見的,讓我感覺好玩的是,js裡變數在宣告之前已經可用,這種特性在js裡稱為宣告提前,也就是在js函式裡宣告的所有變數都被提前到函式體的頂部,

例:

var value = " all"

function test ()

輸出

可能大家會認為第乙個會輸出all 其實是undefined

第二個是new

由於函式作用域的特性,區域性變數在整個函式體始終是有定義的,也就區域性變數會覆蓋全域性變數,,只有執行到var的時候才會被真正賦值。

作用域鏈:

js是一門基於詞法作用域的願,全域性變數在整個程式中都是有定義的,而區域性變數在她的函式體內及其內部巢狀的函式內都是有定義的,我們可以換個角度來理解作用域,每一段js**都有乙個與之關聯的作用域鏈,作用域鏈是什麼呢,就是乙個物件列表或者鍊錶,這組物件定義了了這段**的作用域中的變數。

假設我們需要查詢乙個a的值,就會從程式的作用域鏈中的第乙個物件中查詢,如果有,直接呼叫,如果沒有繼續查詢第二個,如果將作用域鏈查詢完畢,都沒有找到,就會丟擲引用錯誤。

作用域鏈的理解對於之後的閉包概念的理解很重要,接下來再去理解閉包的概念

JS學習 閉包

function eater push function myfood return obj var eater1 eater eater1.push banana eater1.eat 函式eat 和 push 共用乙個閉包 food立即執行函式,執行完會馬上把函式釋放,針對初始化功能的函式。va...

初步學習JS中的閉包

js高階程式設計 3rd 中對閉包的定義就是一句話,首先閉包是乙個函式,怎樣的函式呢?有權訪問另乙個函式作用域中的變數 的函式。而建立閉包的常見方式就是在乙個函式的內部建立另乙個函式,就是巢狀函式。閉包會涉及到的點主要有 作用域鏈 這個原理讓我們明白內部巢狀的函式是能夠訪問外部父函式裡定義的變數的,...

理解js的閉包

閉包 將內部函式儲存到外部時,將會生成閉包。閉包會導致原有的作用域鏈不釋放,造成記憶體洩漏。先來看乙個閉包的例子 functiona returnb vartemp a temp temp 此時輸出結果是2 和3,函式b和a形成了閉包,函式b被儲存到外部。functiontest functionb...