让'this'按照我的预期行事时遇到一些麻烦 -
基本上,我有一个对象,我无法从同一对象中的函数访问对象中的数组 -
看起来像这样:
var articles = {
article : {
1: {
title : 'This is a Title',
content : 'This is the content of the article'
},
2: {
title : 'This is the second article',
content : 'This is the second article content'
},
3: {
title : 'This is the third article',
content : 'Making information transferrable. Identifiable. Manipulatable.'
}
},
numArticles : function(){
var size = 0, key;
for (key in this.article){
if(this.article.hasOwnProperty(key)) size++;
}
return size;
},
buildInterface : function(){
var aSize = this.numArticles();
for(var i = 0; i < aSize; i++){
$('body').append('<article><h2>' + this.article[i].title + '</h2></article>');
}
}
}
在这种情况下,buildInterface()函数无法访问“article”数组。
以下是一个正在进行中的示例:
http://jsfiddle.net/merk/xV2n6/41/
任何帮助都将不胜感激 -
我有预感这可能是一个范围问题 - 希望它不是与JSFiddle相关的东西 -
非常感谢 -
和平
标记
答案 0 :(得分:3)
您的article
变量的索引不一致:属性是从1
开始定义的,但您从0
方法buildArticles
循环中的for
开始。你可以用......解决这个问题。
for(var i = 1; i <= aSize; i++){
$('body').append('<article><h2>' + this.article[i].title + '</h2></article>');
};
...或(这对我的口味来说要好得多,因为你基本上试图使用Object来完成数组的工作)将article
定义重写为一个合适的数组:
article : [{
title : 'This is a Title',
content : 'This is the content of the article'
}, {
title : 'This is the second article',
content : 'This is the second article content'
}, {
title : 'This is the third article',
content : 'Making information transferrable. Identifiable. Manipulatable.'
}],
...
...让你的buildArticles for
循环播放(因为索引现在正确地从0开始)。
article.length
就足够了。
这是JS Fiddle这种方法的例子。
作为旁注,如果您实际检查过调试器,您会注意到它是this.articles[0]
undefined
(因此尝试从title
取出它是错误的),而不是this.articles
。因此,这绝对不是范围问题。
答案 1 :(得分:0)
这应该有效:
var articles = {
article : {
1: {
title : 'This is a Title',
content : 'This is the content of the article'
},
2: {
title : 'This is the second article',
content : 'This is the second article content'
},
3: {
title : 'This is the third article',
content : 'Making information transferrable. Identifiable. Manipulatable.'
}
},
numArticles : function(){
var size = 0, key;
for (key in this.article){
if(this.article.hasOwnProperty(key)) size++;
}
return size;
},
buildInterface : function(){
var aSize = this.numArticles();
for(var i = 1; i <= aSize; i++){
console.log( '<article><h2>' + this.article[i]['title'] + '</h2></article>');
};
}
}
在您的情况下,您已经开始使用数组中零位置的元素。但你没有0元素。所以它会给你一个错误。这是按预期工作的。