2014-11-04 248 views
0

我正在阅读http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/,并试图更好地理解“这个”。使用forEach访问对象数据,而不使用forEach的thisArg?

但是我遇到了令我困惑的事情:我似乎无法使用forEach的“this”参数访问对象数据(在本例中为“用户”对象)。

http://jsfiddle.net/t7fvj0zp/

我能得到的信息是这样的:

var user = { 
    tournament:"The Masters", 
    data :[ 
    {name:"T. Woods", age:37}, 
    {name:"P. Mickelson", age:43} 
    ], 

    clickHandler:function() {    
     this.data.forEach (function (person) { 
      console.log (person.name); 
     }) 
    } 
} 

user.clickHandler(); //"T. Woods", "P. Mickelson" 

然而,下面带来了 “不确定”:

console.log (user.data.name); 

或者这带来了“this.user是未定义“:

console.log (this.user.data.name); 

我错过了什么?是不是可以“回溯”,并且在forEach中,不使用thisArg访问对象信息?或者,或许,与长期书写的“人”等同的是什么?

+1

'user.data'是一个数组。尝试'console.log(user.data [0] .name);'而不是 – friedi 2014-11-04 16:52:04

+0

@friedi谢谢,这确实奏效。但是,因为它是一个forEach循环,是否有办法打印这两个名字?或者是在thisArg变得必要的地方,或者forEach循环中的“for”循环?编辑:好吧,钽下面说“不”。 – Terf 2014-11-04 16:59:38

回答

1

根据MDN's forEach documentation

如果thisArg参数提供给forEach,它会通过调用时,用作this值回调。否则,将传递值undefined作为其值。

因此,不可能在不使用thisArg的情况下“回溯”并访问对象信息。

+0

谢谢,我确实读过,但没有完全理解这意味着什么。 – Terf 2014-11-04 17:00:35

1

数据对象的数组,不是关联数组, 所以你可以试试:

console.log (user.data[0].name); 

console.log (this.user.data[0].name); 

接取您的数据。

,你需要传递一个参数的forEach到aceess这样

clickHandler:function() {    
     this.data.forEach (function (value) { 
      console.log (value.name); 
     }) 
    } 

http://jsfiddle.net/t7fvj0zp/1/

希望i的值帮助