淺談javascript的閉包,淺談javascript
關於閉包的解釋
我們將範圍鏈描述為一個對象列表,不是綁定的棧。每次調用javascript函數的時候,都會為之建立一個新的對象來儲存變數,把這個對象添那個加至範圍中,當函數返回時,就從範圍鏈中將這個綁定變數的對象刪除,如果不存在嵌套函數,也沒有其他引用指向這個綁定的對象,它就會被當記憶體回收掉,
(function () { var val = null; var callback; setTimeout(function () { val = 1; callback(val) },1000) window.getVal = function(fn){ callback = fn; } })(); (function(){ var b =3; getVal(function (val) { console.log(val);//1 console.log(b); //3 getVal(function (val) { console.log(val); console.log(b); //這裡為什麼還能列印出b這個變數呢/. }); //這裡匿名函數其實就是一個閉包,你就相當於通過getVal函數把這個閉包傳遞出去了,你想想看,閉包是不是這樣?})();//2範圍 (function(){ var b =3; var ret = function (val) { console.log(val);
利用閉包實現的私人屬性存取方法
function c return { count:function(){ return n++; } }; } var a=counter(); alert(a.count());//返回的0; alert(a.count());//返回的是1;
定義的閉包實現的私人屬性方法
function addPrivateProperty(o,name,predicate){var value;o["get"+name]=function(){return value);}//get 存取器的屬性唯讀,將其直接簡單的返回//setter方法檢驗值是否合法,若不合法就拋出異常o["set"+name]=function(v){{if(predicate&&!predicate(v)) throw Error("");else {value=v;}}
典型錯誤
function constfuncs(){var funcs=[];for(var i=0;i<10;i++){funcs[i]=function(){return i;};}return funcs;}var func=constfuncs();console.log(func[5]());;//傳回值? 10
由於此函數的閉包都是在同一個函數調用中定義的,因此可以共用變數i;
關聯到閉包的範圍鏈都是活動的,嵌套的函數不會將範圍內的私人成員複製一份,也不會對所綁定的變數產生靜態快照;在閉包時後this是javascript的一個關鍵字而不是變數
解決辦法
function Bb(){this.run=function(){}//this就是Bb這個對象;}而function run(){function gg(){alert(this就是window)}//this就是window;`}
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的協助,同時也希望多多支援幫客之家!