閉包常用的3種中方法
1. 通過在函數中創建函數,並返回來延遲作用域鏈的存在時間(掌握執行環境/作用域鏈/this/活動對象/arguments/全局對象概念的理解)
2. 模仿塊級作用域 (javascript不存在塊級作用域)
for(var i=0;i<10;i++){
alert(i);
}
alert(i); //10
function outputNumbers(count){
(function(){
for(var i=0;i<count;i++){
}
})();
alert(i); // 找不到該變量 //匿名函數自執行后嗎,變量占的內存空間全部釋放<br>}
3. 創建私有變量
可以使用構造函數或原型模式來創建私有變量:
function person(name){
this.getname = function(){
return name;
};
this.setname = function(value){
name = value;
};
}
var person1 = new person(‘pingzidong’);
person1.setname(‘mm’);
alert(person1.getname());
如何從外部讀取局部變量?
出於種種原因,我們有時候需要得到函數內的局部變量。但是,前面已經說過了,正常情況下,這是辦不到的,只有通過變通方法才能實現。
那就是在函數的內部,再定義一個函數。
Js代碼
function f1(){
n=999;
function f2(){
alert(n); // 999
}
}
在上面的代碼中,函數f2就被包括在函數f1內部,這時f1內部的所有局部變量,對f2都是可見的。但是反過來就不行,f2內部的局部變量,對f1 就是不可見的。這就是Javascript語言特有的“鏈式作用域”結構(chain scope),
子對象會一級一級地向上尋找所有父對象的變量。所以,父對象的所有變量,對子對象都是可見的,反之則不成立。
既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值,我們不就可以在f1外部讀取它的內部變量了嗎!
Js代碼
function f1(){
n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999