2011-05-05 78 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

相關問題