您好,登錄后才能下訂單哦!
關(guān)于閉包的解釋
我們將作用域鏈描述為一個(gè)對(duì)象列表,不是綁定的棧。每次調(diào)用javascript函數(shù)的時(shí)候,都會(huì)為之創(chuàng)建一個(gè)新的對(duì)象來(lái)保存變量,把這個(gè)對(duì)象添那個(gè)加至作用域中,當(dāng)函數(shù)返回時(shí),就從作用域鏈中將這個(gè)綁定變量的對(duì)象刪除,如果不存在嵌套函數(shù),也沒(méi)有其他引用指向這個(gè)綁定的對(duì)象,它就會(huì)被當(dāng)垃圾回收掉,
(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這個(gè)變量呢/. }); //這里匿名函數(shù)其實(shí)就是一個(gè)閉包,你就相當(dāng)于通過(guò)getVal函數(shù)把這個(gè)閉包傳遞出去了,你想想看,閉包是不是這樣? })(); //2作用域 (function(){ var b =3; var ret = function (val) { console.log(val);
利用閉包實(shí)現(xiàn)的私有屬性存取方法
function c return { count:function(){ return n++; } }; } var a=counter(); alert(a.count());//返回的0; alert(a.count());//返回的是1;
定義的閉包實(shí)現(xiàn)的私有屬性方法
function addPrivateProperty(o,name,predicate){ var value; o["get"+name]=function(){return value);}//get 存取器的屬性只讀,將其直接簡(jiǎn)單的返回 //setter方法檢驗(yàn)值是否合法,若不合法就拋出異常 o["set"+name]=function(v){{ if(predicate&&!predicate(v)) throw Error(""); else { value=v; } }
典型錯(cuò)誤
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
由于此函數(shù)的閉包都是在同一個(gè)函數(shù)調(diào)用中定義的,因此可以共享變量i;
關(guān)聯(lián)到閉包的作用域鏈都是活動(dòng)的,嵌套的函數(shù)不會(huì)將作用域內(nèi)的私有成員復(fù)制一份,也不會(huì)對(duì)所綁定的變量生成靜態(tài)快照;在閉包時(shí)后this是javascript的一個(gè)關(guān)鍵字而不是變量
解決辦法
function Bb(){ this.run=function(){}//this就是Bb這個(gè)對(duì)象; } 而function run(){ function gg(){alert(this就是window)}//this就是window;` }
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持億速云!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。