2014-10-02 169 views
1

我想將嵌套的JavaScript函數作爲概念的證明。我發現了一個例子,修改了一些適合我證明concent的:嵌套的JavaScript函數

var t = { 
    nestedOne: { 
     nest: function() { 
      alert('nest'); 
      this.nestedTwo.nest2(); 
     }, 
     nest3: function() { 
      alert('nest3'); 
     },  
     nestedTwo: { 
      nest2: function() { 
       alert('nest2'); 
       t.nestedOne.nest3(); 
      }  
     } 
    } 
}; 

t.nestedOne.nest(); 

// *** Output is nest, nest2 and nest3 *** 

這工作,但我不知道爲什麼在nest2,我有t.nestedOne.nest3打電話,而不是this.nestedOne.nest3,類似於我從如何調用nest2。

+4

很多未嵌套函數,但嵌套的對象。 – Jamiec 2014-10-02 12:03:52

+0

出於同樣的原因,您不能在'nest'方法內使用'this.nestedOne.nestedTwo.nest2()'。 – Bergi 2014-10-02 12:07:34

回答

2

它的所有的this

解釋最簡單的方法而言,是使你的代碼略有變化:

var t = { 
    nestedOne: { 
     nest: function() { 
      console.log('nest',this); 
      this.nestedTwo.nest2(); 
     }, 
     nest3: function() { 
      console.log('nest3',this); 
     },  
     nestedTwo: { 
      nest2: function() { 
       console.log('nest2',this); 
       t.nestedOne.nest3(); 
      }  
     } 
    } 
}; 

t.nestedOne.nest(); 

從上述的輸出是

巢對象{nestedTwo = {...},巢=()的函數,nest3 =函數()}
nest2對象{nest2 =函數()}
nest3對象{nestedTwo = {...},巢=()的函數,nest3 =函數()}

注意,在第二呼叫,this指功能,不再的對象。現在

,您可以進行以下2改變

  • 呼叫next2傳遞的this背景: this.nestedTwo.nest2.call(this);

  • 使用thisnest2this.nest3();

和所有按預期工作:

var t = { 
 
    nestedOne: { 
 
     nest: function() { 
 
      console.log('nest',this); 
 
      this.nestedTwo.nest2.call(this); 
 
     }, 
 
     nest3: function() { 
 
      console.log('nest3',this); 
 
     },  
 
     nestedTwo: { 
 
      nest2: function() { 
 
       console.log('nest2',this); 
 
       this.nest3(); 
 
      }  
 
     } 
 
    } 
 
}; 
 

 
t.nestedOne.nest();

+0

嗯,我沒有看到任何東西在輸出窗口,當我點擊「運行代碼片段」。 – brinch 2014-10-02 19:43:48

+0

奇怪,我願意 - 你在瀏覽什麼? – Jamiec 2014-10-02 20:18:36

+0

我正在使用Chrome。 – brinch 2014-10-02 21:15:43

0

函數調用的上下文由調用該函數的對象確定,而不是用於訪問該函數的路徑中最左側的對象。

這樣的:

this.nestedTwo.nest2(); 
    ^^^^^^^^^ 

不是這個:

this.nestedTwo.nest2(); 
^^^^