淺談javascript的閉包
關于閉包的解釋
我們將作用域鏈描述為一個對象列表,不是綁定的棧。每次調(diào)用javascript函數(shù)的時候,都會為之創(chuàng)建一個新的對象來保存變量,把這個對象添那個加至作用域中,當函數(shù)返回時,就從作用域鏈中將這個綁定變量的對象刪除,如果不存在嵌套函數(shù),也沒有其他引用指向這個綁定的對象,它就會被當垃圾回收掉,
(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這個變量呢/.
});
//這里匿名函數(shù)其實就是一個閉包,你就相當于通過getVal函數(shù)把這個閉包傳遞出去了,你想想看,閉包是不是這樣?
})();
//2作用域
(function(){
var b =3;
var ret = function (val) {
console.log(val);
利用閉包實現(xiàn)的私有屬性存取方法
function c
return {
count:function(){
return n++;
}
};
}
var a=counter();
alert(a.count());//返回的0;
alert(a.count());//返回的是1;
定義的閉包實現(xiàn)的私有屬性方法
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
由于此函數(shù)的閉包都是在同一個函數(shù)調(diào)用中定義的,因此可以共享變量i;
關聯(lián)到閉包的作用域鏈都是活動的,嵌套的函數(shù)不會將作用域內(nèi)的私有成員復制一份,也不會對所綁定的變量生成靜態(tài)快照;在閉包時后this是javascript的一個關鍵字而不是變量
解決辦法
function Bb(){
this.run=function(){}//this就是Bb這個對象;
}
而function run(){
function gg(){alert(this就是window)}//this就是window;`
}
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關文章
基于cssSlidy.js插件實現(xiàn)響應式手機圖片輪播效果
cssSlidy是一款支持手機移動端的焦點圖輪播插件,支持標題設置,滑動動畫,間隔時間等。這篇文章主要基于cssSlidy.js插件實現(xiàn)響應式手機圖片輪播效果,2016-08-08
深入理解JavaScript函數(shù)參數(shù)(推薦)
這篇文章主要介紹了深入理解JavaScript函數(shù)參數(shù)(推薦)的相關資料,需要的朋友可以參考下2016-07-07
微信企業(yè)號開發(fā)之微信考勤Cookies的使用
使用微信考勤,每次使用微信企業(yè)號開發(fā):微信用戶信息和web網(wǎng)頁的session的關系這個里邊的方法,調(diào)用微信的接口,有點慢,微信官方也推薦使用Cookies,但如何使用Cookies,自己卻一直沒有搞清楚。下面小編幫大家解決難題,需要的朋友可以參考下2015-09-09
JavaScript讓IE瀏覽器event對象符合W3C DOM標準
IE瀏覽器event對象跟W3C實現(xiàn)的不一樣.所以自己封裝一個EventUtil類來讓IE瀏覽器的event對象與W3C一樣.2009-11-11

