2

html:

<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/

これを実行すると、Chromethis.divは未定義であると言いました。ここで何が問題なのですか?

[更新] コードを次のように変更すると、次のことがわかりました。

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

できます。しかし、なぜ最初のケースがうまくいかないのでしょうか?

4

4 に答える 4

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')
于 2011-05-05T04:59:17.050 に答える
1

これを使用できない理由は、JSON オブジェクトがまだ実際に初期化されていないためです。これは私があなたがやろうとしていることをする方法です:

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

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

また

var my_div = document.getElementById("slide");

var slider = {
    my_div: my_div,
    my_divs: my_div.getElementsByTagName("div")
};

alert(slider.my_divs.length);
于 2011-05-05T04:58:25.093 に答える
0

コードが機能しないため、オブジェクトリテラル(角かっこ内にあるもの)を作成するときに、オブジェクトがまだ存在しないため、this未定義です。

それはあなたがあなた自身の父であるかもしれないと思っているようなものです、あなたはあなたの創造の瞬間に存在しません。

于 2011-05-05T05:07:45.557 に答える
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");
于 2011-05-05T05:01:46.063 に答える