<script src="jquery.js"></script><script> var $ = function(selector){ return document.querySelectorAll(selector);//給$重新賦值了 }; $('div').CSS(...);//報錯,此時$('div')是nodeList類型,沒有css方法</script>2. 閉包
起因:在函數內部聲明的數據,在函數外是不能夠直接訪問的。閉包含義:就是包裹、包裝的意思。閉表示封閉,即不可訪問。 所謂的閉包就是一個具有封閉的特性,同時具有包裹的特性的一種結構。 從代碼的角度說,所謂的閉包就是函數。① 函數內聲明的變量,外界無法訪問,即封閉性。② 函數本身又是一個封裝單位,利用函數可以封裝代碼,因此一個函數也是一個包裹結構。因此函數既有包裹的特性,也有封閉的特性,因此可以直接稱呼函數為閉包 (closure)凡是函數要執行,就會分配內存空間以供函數執行如果函數執行結束,內存會被釋放,即可以重復使用這個定義是有缺陷的。如果函數內部將數據的引用返回到外部,那么就可以保證數據被一直占用。function foo(){ var num = 123; function func(){ return num; } return func;}var f = foo(); // f指向func,foo不可以被釋放,因為func// num不能被釋放,因為f會返回該數據3. 所謂的閉包就是函數,其特點是函數內定義的變量,在函數外是無法訪問的。
但是閉包需要解決的問題是如何間接的訪問到這些數據。如何訪問函數中的數據?① 最簡單的訪問方式:返回function foo(){var num = 123;return num;}var res1 = foo();var res2 = foo();//但兩次訪問的并不是同一個數據② 多次訪問,f 只允許調用一次var res1 = foo();var res2 = res1;③ 使得函數返回一個函數,利用函數返回數據function f(){var num = 123;return function(){ //作用域訪問規則,是可以訪問num的 return num; };}var foo = f();//先執行,只調用了一次var res1 = foo();//獲取num的值var res2 = foo();//訪問的是同一個值將2級鏈返回到0級鏈中,利用2級鏈可以訪問1級鏈的特性,使得0級鏈間接的訪問到1級鏈。因此這個數據是不能被銷毀的,即不能被釋放。小結:所謂的閉包,就是一個函數,因為函數中聲明的變量,外界無法訪問,函數就構成了封閉結構,因此成為閉包。同時如果需要訪問函數中的數據,可以考慮利用函數返回一個函數,使用返回的函數操作函數內的數據,以使得函數外可以通過這個函數內返回的函數,訪問內部的數據。4. 補充:內存釋放在 js 中凡是不被使用的數據,可以被釋放
5. 閉包的用法
(1)作為沙箱模式
沙箱:就是一個獨立的與外界隔離的運行環境(function)(function(){ //此處的代碼,對外隔離,外界無法訪問,但是可以執行})();暴露方式:var foo = (function(){function foo(){} return foo;})();(2)帶有緩存功能的函數
var func = (function(){ //私有數據 return function foo(){ };})();//func帶有私有數據遞歸中,為什么性能低?因為重復的太多了,將已經計算好的存儲起來,如果沒有計算,就遞歸,但是算完以后還是存起來。
新聞熱點
疑難解答