2014-10-02 99 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(); 
^^^^