摘要:在內部,理所當然能訪問到局部變量,但當作為的返回值賦給外的全局變量時,神奇的事情發生了在全局作用域中訪問到了,這就是閉包。而閉包最神奇的地方就是能在一個函數外訪問函數中的局部變量,把這些變量用閉包的形式放在函數中便能避免污染。
一、閉包是什么?
二、閉包的原理?《JavaScript高級程序設計》中寫道:“閉包是指有權訪問另一個函數作用域中的變量的函數”,如果用下定義的觀點看,這句話就是說“閉包是函數”,我帶著懷疑的心態又去網上找了找,發現什么說法都有,終究沒能明白閉包的含義,還是看代碼來得直接。
function outter(){ var sky="blue"; function inner(){ console.log(sky); } return inner; } var result=outter(); result(); //"blue"這段代碼就包含一個簡單的閉包:outter函數的返回值是一個函數,即inner。inner在outter內部,理所當然能訪問到局部變量sky,但當inner作為outter的返回值賦給outter外的全局變量時,神奇的事情發生了:在全局作用域中訪問到了sky,這就是閉包。
三、閉包有什么用?每個函數都有自己的執行環境,當一個函數被執行時,它的執行環境就會被推入環境棧,其活動對象(存儲環境中定義的變量及函數)加入作用域鏈中,一旦函數執行完,棧將其環境彈出,活動對象被銷毀。
對于上面的例子來說,outter執行完之后將返回inner給了result,outter的執行環境從環境棧彈出,控制權交給全局環境,outter的活動對象理應被銷毀。但此時inner已經存儲在全局活動對象中了,同時inner需要訪問sky,所以outter的活動對象沒有被銷毀,即使result執行完畢,outter的活動對象依然存在于作用域鏈中,只有當result被銷毀
result = null;outter的活動對象才會徹底釋放。
四、Caveat說了這么多,閉包到底有什么用呢?我個人認為閉包最大的用處就是防止對全局作用域的污染。 試想如果我們把一些僅僅只用到一兩次的變量都聲明在全局作用域中,最后肯定是容易出錯且不可維護的。而閉包最神奇的地方就是能在一個函數外訪問函數中的局部變量,把這些變量用閉包的形式放在函數中便能避免污染。
閉包將函數的活動對象維持在內存中,過度使用閉包會導致內存占用過多;
閉包只能取得外部函數中任何變量的最后一個值,在使用循環且返回的函數中帶有循環變量時會得到錯誤結果;
當返回的函數為匿名函數時,注意匿名函數中的this指的是window對象。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83882.html
摘要:我們可以用普通函數內部嵌套匿名函數,形成一個閉包來使變量駐留在內存中。局部變量閉包為什么要將賦值給變量呢這里我們就要談到匿名函數調用問題匿名函數如何調用還是上面的例子會將整個函數體打印出來這樣才調用了函數內部的匿名函數看到這里。 閉包含義: 閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見的方式,就是在一個函數內部創建另一個函數,通過另一個函數訪問這個函數的局部變量。 這...
摘要:但是函數返回了內部函數,內部函數會隨時訪問變量所以垃圾回收機制是不會回收函數的內部作用域的,這就是閉包的含義。也就是函數在定義的詞法作用域以外的地方被調用,閉包使得函數可以繼續訪問定義時的詞法作用域。 初學JavaScript閉包時,閉包這個概念在我眼里及其的神秘,也不知道這個東西在講什么,尤其某些地方的閉包概念定義的非常抽象,屬于那種本來你可能明白這個概念,看了反而又把你給繞糊涂...
摘要:關于循環和閉包當循環和閉包結合在一起時,經常會產生讓初學者覺得匪夷所思的問題。閉包是一把雙刃劍是比較難以理解和掌握的部分,它十分強大,卻也有很大的缺陷,如何使用它完全取決于你自己。 在談閉包之前,我們首先要了解幾個概念: 什么是函數表達式? 與函數聲明有何不同? JavaScript查找標識符的機制 JavaScript的作用域是詞法作用域 JavaScript的垃圾回收機制 先來...
摘要:將作用域賦值給變量這里的作用域是,而不是將作用域賦值給一個變量閉包返回瀏覽器中內存泄漏問題大家都知道,閉包會使變量駐留在內存中,這也就導致了內存泄漏。 上一章我們講了匿名函數和閉包,這次我們來談談閉包中作用域this的問題。 大家都知道,this對象是在運行時基于函數的執行環境綁定的,如果this在全局就是[object window],如果在對象內部就是指向這個對象,而閉包卻是在運行...
閱讀 2470·2021-11-17 09:33
閱讀 757·2021-11-04 16:13
閱讀 1329·2021-10-14 09:50
閱讀 691·2019-08-30 15:53
閱讀 3657·2019-08-30 14:18
閱讀 3268·2019-08-30 14:14
閱讀 2093·2019-08-30 12:46
閱讀 3178·2019-08-26 14:05