你不知道的this指向

javascript中,咱們預想的this指向,有時候與預期不同,直接上經典例子javascript

    window.name=2;
    var test={
            'name':1,
            'getName':function(){
          console.log(this.name);//輸出1
             return function(){
               console.log(this.name);//輸出2
                }
            }
        }
    
    test.getName()();         

 

  上面爲最經典的一個this指向解析案例,第一個this指向test對象,第二個this指向window全局對象,第一個console運行的是test對象裏面的方法 ,第二個console運行的是一個匿名函數(也能夠稱爲普通函數)在JavaScript中普通函數的this指向的是全局對象的,上面字面量的建立test對象隱含着new關鍵詞,整個test是一個新的對象,getName屬於test裏面的方法,this會指向test對象,而getName裏面return的函數,屬於一個普通函數,這個函數裏的this會指向window全局,java

ps:其實還能夠用閉包的解析,我我的以爲若是這個沒弄明白,再提閉包會讓人更加迷惘。閉包

假設你想把第二對象指向test,能夠使用call在調用時候改變app

      window.name=2;
    var test={
            'name':1,
            'getName':function(){
                  console.log(this.name);
                return function(){
                    console.log(this.name);
                }
            }
        }
    
    test.getName().call(test); //輸出1,1    
    test.getName().apply(test); //輸出1,1 

還有一個改變this對象的方法,在test裏面的方法嵌套函數以前,先把test對象(指向test的this)用變量的方式保存下來,下面的案例代碼函數

      window.name=2;
    var test={
            'name':1,
            'getName':function(){
                var that=this;//預先把指向test的this保存到that變量中
             console.log(this.name);//輸出1
                return function(){
                    console.log(that.name);//輸出1
                }
            }
        }
    
    test.getName()();         
相關文章
相關標籤/搜索