2011-05-05 40 views
2

的HTML:为什么创建这个javascript对象文字时我不能使用'this'?

<div id="slide"> 
    <div>This is one</div> 
    <div>This is two</div> 
    <div>This is three</div> 
</div> 

的JavaScript:

var slider = { 
    div: document.getElementById("slide"), 
    divs: this.div.getElementsByTagName("div") 
}; 

alert(slider.divs.length); 

的jsfiddle:http://jsfiddle.net/CAzN8/

当我运行此目的,Chrome说this.div是不确定的。这里有什么问题?

[更新]我发现,如果我的代码更改为:

var tmp = document.getElementById("slide"); 
var slider = { 
    div: tmp, 
    divs: tmp.getElementsByTagName("div") 
}; 

它的工作原理。但为什么第一个案件不能运作?

+0

这是*文字对象*,而不是“JSON对象”。 JSON是一种用于表示数据的文本格式,所以这个问题根本不在于使用JSON。 – Guffa 2011-05-05 05:13:28

+0

@Guffa JSON = JavaScript对象表示法。由于这是JavaScript,并且代码使用JavaScript的(文字)对象表示法,所以我认为您会发现这实际上是JSON。 – tobyodavies 2011-05-05 05:14:58

+0

@Guffa谢谢,但这个问题仍然可以使用更好的标题。也许是“为什么我不能在创建这个javascript对象时使用'this'? – Paul 2011-05-05 05:18:34

回答

3

什么this是,动态的方法测定被调用,而不是词汇的代码块驻留在

在JSON对象体内简单使用this并不意味着它指的是正在构建的对象。它几乎肯定是指全球窗口对象。

如果你希望能够使用this你想要一个构造函数:

function Slider(id,tagName){ 
    this.div = document.getElementById(id); 
    this.divs = this.div.getElementsByTagName(tagName); 
} 

s = new Slider('slide','div') 
1

你不能使用它的原因是因为JSON对象还没有被实际初始化。这是我会怎么做你想要做什么:

var slider = { 
    my_div: document.getElementById("slide"); 
}; 

slider.my_divs = slider.my_div.getElementsByTagName("div"); 
alert(slider.my_divs.length); 

​​
+0

是的,这将工作。但为什么我的版本不能工作? – wong2 2011-05-05 04:59:28

+0

,因为在这种情况下,“this”不是你正在构造的对象。 – tobyodavies 2011-05-05 05:00:43

+0

哦,是的!当我构造'slider'时,我可以引用'slider'的'my_div'吗?我的意思是说,我不想在'slider'外面有一个'my_div' – wong2 2011-05-05 05:03:43

0

由于对象实际上并没有尚未实例化。这将工作,虽然:

var slider = { 
    div: document.getElementById("slide"), 
    divs: document.getElementById("slide").getElementsByTagName("div") 
}; 

var slider = {}; 
slider.div = document.getElementById("slide"); 
slider.divs = slider.div.getElementsByTagName("div"); 
0

您的代码不工作的原因,创建对象字面(什么是括号内)时,对象还不存在,所以this是未定义。

这就像想你可能是你自己的父亲,你不存在你创作的时刻。

+0

'this'不应该是未定义的,它应该是'window'对象。 – tobyodavies 2011-05-05 05:19:51

+0

我不是在谈论保留字,而是它的意思。也许我应该说“未申报” – 2011-05-05 06:59:51

相关问题