首頁  >  文章  >  web前端  >  js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解

js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解

云罗郡主
云罗郡主原創
2019-01-21 14:22:113247瀏覽

在學習js過程中會,必定要知道、明白的閉包。閉包是與其他程式語言相比,是js中所特有的一個。以下就是我對閉包的認知。

閉包的產生:通俗的說,閉包產生於多個函數嵌套之間,當內層函數被保存到外面時,閉包就會產生。 【推薦閱讀:JavaScript影片教學

作用域鏈:我的理解是,在訪問函數時,採用鍊式訪問,而這個訪問的區域就是一個作用域鏈。

js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解

在這段程式碼中,首先訪問f(),之後再訪問b() ,之後再訪問c(),在這一個例子中,就體現了一種鍊式的存取過程。

下面我們要來談談閉包的功能

閉包的好處:

第一個:函數的累加         第二:快取結構    第三:封裝   模組化

閉包的壞處:

閉包會導致原有作用域鏈不釋放,造成記憶體洩漏。

下面就是幾個閉包的實際例子:

js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解

在這個閉包的例子中,如果沒有return b語句,呼叫這個函數時, f()的值只能為342;當有了這條語句後,所印出來的值依序是增加的,這個就是閉包所產生的一個效果。

js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解

當執這段程式碼時,你會發現你所印出來的結果為10個10,可是為什麼會產生這種效果呢?然後又要怎麼解決這種效果呢?

js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解

當執行這段程式碼時,你會發現此時列印出來的結果就為0到9一次從小到大輸出。

產生上述的10個10的原因其實就是因為閉包所導致的,其中

arr[i] = function(){ document.write(i " ")  }   此語句為函數表達式,此時arr[i]與document.write(i " ") 不是想對應的,document.write(i " ") 為輸出語句,只有當整個函數中的for迴圈執行完之後才來看這個語句,由於閉包,此時的i由於for循環就i就依次的增加了,直到語句結束時,i為10,因此打印出的結果就是10個10.

下面為什麼會印出0到9這10個數字呢,在這裡就利用了立即執行函數,

立即執行函數的量兩種形式:(function (){}();   (function (){ })(); 通常採用第一種。

那什麼是立即執行函數呢,其實可以將其概括為只執行一次的函數,當執行完一次後,不能調用不能執行。因此,在後面輸出0到9這過程中,由於此時的i為實參,每一次傳到立即執行函數裡面時,j就是此時i的值,只是整個表達式還沒有執行而已。所以到最後輸出的時候就自然而然的輸出了0到9這10個數字。


以上是js閉包與作用域鍊是什麼意思? js閉包與作用域鏈詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn