javascript閉包的定義及應用實例分析
官方解釋
“閉包”是一個擁有許多變量和綁定了這些變量的環境表達式(通常是一個函數),因而這些變量也是環境表達式的一部分。
通俗解釋
Javascript中所有的函數都是一個閉包。不過一般來説,嵌套的function產生的閉包更為強大,也是大部分時候我們所説的“閉包”。看如下代碼:
複製代碼 代碼如下:
這段腳本在執行完var c=a()之後,變量c實際上就指向了函數b,b中用到了變量i,再執行c()後就會彈出一個窗口顯示i的值。這段代碼其實就是一個閉包,為什麼?因為函數a外的變量c引用了函數a內部的函數b。
Javascript的垃圾回收機制
由於javascript特殊的垃圾回收機制,才導致了閉包的產生。Javascript垃圾回收機制的.大體規則如下:
在javascript中,如果一個對象不再被引用,那麼這個對象就會被GC回收。如果兩個對象相互引用,而不再被第3者引用,那麼這兩個互相引用的對象也會被回收。而在上述的腳本中,函數a被b引用,函數b又被函數a外的c所引用,這就是為什麼函數a執行後不被回收的原因。
閉包的應用場景
1. 保護函數內的變量安全。以上面的例子為例,函數a中變量i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。
2. 在內存中維持一個變量。依然如上面的例子,由於閉包,函數a中的i一直存在於內存中,因此每次執行c(),i都會加1。
3. 通過保護變量的安全實現JS私有屬性和私有方法(不能被外部訪問)。如下,私有屬性和私有方法在Constructor外是無法訪問的:
複製代碼 代碼如下:
function Constructor(…){
var that = this;
var membername = value;
function membername(…){…}
}
-
SQL語句類型的標準模式
1、查詢語句:主要是由select關鍵字完成2、事務控制語句:主要由commit、rollback和savepoint三個關鍵字完成3、DML(數據操作語言)語句:主要由、update和三個關鍵字完成4、DDL(數據定義語言)語句:主要由create、alter、drop和truncate四個關鍵字完成5、DCL(數據控制...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想説説javascript中函數的隱含參數:argumentsarguments該對象代表正在執行的函數和調用它的函數的參數。[function.]arguments[n]參數function:選項。當前正在執行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數值...
-
asp下去除超鏈接函數
複製代碼代碼如下:<%FunctionReplaceUrl2(HTMLstr)Dimn,str1,str2,str3,str4HTMLstr=Lcase(HTMLstr)Forn=1toUbound(Split(HTMLstr,"(.+?)"RegRemoveHref=ace(HTMLstr,"$1")ENDFunction...
-
JavaScript中的style.cssText使用教程分解
很多人用過r、lay等直接設置元素的.樣式屬性,但是ext用過的人就不多了。cssText本質是什麼?cssText的本質就是設置HTML元素的style屬性值。cssText怎麼用?複製代碼代碼如下:lementById("d1")ext="color:red;font-size:13px;";看了這個示例後,相信不説,也知道ext是什...