在高級應用中需要依靠js閉包(closure)來實現~ 1.變數的作用域:全局變數和局部變數。 Javascript可以在函數內部直接讀取全局變數。 var a=1; //全局變數 var c=2; //運行方法a1後 c被賦值為3 function a1(){ alert(a); //可獲得全局變 ...
在高級應用中需要依靠js閉包(closure)來實現~
1.變數的作用域:全局變數和局部變數。
Javascript可以在函數內部直接讀取全局變數。
var a=1; //全局變數
var c=2; //運行方法a1後 c被賦值為3
function a1(){
alert(a); //可獲得全局變數a
var b =2; //局部變數 只能方法a1內調用
c = 3; //聲明瞭一個全局變數
}
a1(); //1
alert(c); //3
console.log(a,c); //1 3 //如果不執行a1();那就是1 2 //再如果註釋var c=2,又註釋a1();方法,那就報c沒定義Uncaught ReferenceError: c is not defined
註意:在函數外部無法讀取函數內的局部變數;
2.從外部讀取局部變數:
function aa(){ //var aa = function(){ ... }
var aa=function(){
var a=2;
//console.log("aa"+a); //aa2
function b(){ //閉包函數
var b=a++; //b=a++=2;a=3;
console.log("a:"+a+",b:"+b); //a:3,b:2
}
return b;
}
var c=aa();
c(); //2
//aa(); //只執行aa()里,不執行b(); //var c=aa; 也是一樣 不執行b();
目的:讀取函數內部的變數,使內部變數的值始終保持在記憶體中。
function aa(){
var a=9;
add=function(){a+=1;} //全局變數
function b(){
console.log(a);
}
return b;
}
var c=aa(); //在add();前執行
c(); // 9
add();
c(); // 10
註意:閉包會使得函數中的變數都被保存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題。
解決方法:在退出函數之前,將不使用的局部變數全部刪除。a=null;
練習:
var name = "Tim";
var object = {
name : "Mary",
love: function(){
return function(){
return this.name;
};
}
};
alert(object.love()());
var name = "Tim";
var object = {
name : "Mary",
love: function(){
var she = this;
return function(){
return she.name;
};
}
};
alert(object.love()());
//Tim Mary