從javascript一道閉包面試題說開去

這道題目比較經典了:javascript

var a = 1;
function test(){
    a = 2;
    return function(){
        console.log(a);
    }
    var a = 3;
}
test()();

當時我回答出來了正確答案,可是在一系列追問之下露出了狐狸的尾巴。答案是2java

我當時認爲test執行以後,a=2賦值給了全局,那麼返回function時那裏的a指的是window.a,就是2了。閉包

實際上var a=3這一句是陷阱。 因爲變量提高 a=2以前有一個var a的聲明,這裏的a變成了局部的值。函數

那麼返回函數爲何輸出2? 由於閉包,外層的變量對內部可見。this

var a = 1;
function test(){
    a= 2; 
    return function(){
        console.log(this.a);
    }
    var a = 3;
}
test()();

加大一下難度,這裏會輸出什麼呢?spa

因爲已經知道var a=3是陷阱,而javascript的函數this默認狀況是window,so答案是1.code

 

var name = "The Window";   
  var object = {   
    name : "My Object",   
    getNameFunc : function(){ 
          console.log(this.name);
      return function(){   
        console.log(this.name);  
     };   
    }   
};   
object.getNameFunc()();

這裏輸出是blog

My Objectip

The Window.作用域

閉包做用域在函數{}內,this在閉包內不能傳遞,改爲下面這樣才能都輸出My Object.

 var name = "The Window";   
  var object = {   
    name : "My Object",   
    getNameFunc : function(){ 
          console.log(this.name);
          var tmp= this;
      return function(){   
        console.log(tmp.name);  
     };   
    }   
};   
相關文章
相關標籤/搜索