1. 程式人生 > >閉包的3種方法以及如何從外部讀取局部變量

閉包的3種方法以及如何從外部讀取局部變量

argument 實現 構造 全局 cti set 既然 on() 情況

閉包常用的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

閉包的3種方法以及如何從外部讀取局部變量