为什么可以';我使用';这';当创建这个javascript对象时?

为什么可以';我使用';这';当创建这个javascript对象时?,javascript,dom,javascript-objects,Javascript,Dom,Javascript Objects,html: <div id="slide"> <div>This is one</div> <div>This is two</div> <div>This is three</div> </div> jsfiddle: 当我运行这个程序时,Chrome说,this.div未定义。这里怎么了 [更新]我发现如果我将代码更改为: var tmp = document.getEl

html:

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

当我运行这个程序时,Chrome说,
this.div
未定义。这里怎么了

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

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

它起作用了。但是为什么第一个案例不能工作呢?

您不能使用它的原因是因为JSON对象实际上还没有初始化。这就是我将如何做你想做的事情:

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

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


这个是什么,由被调用的方法动态决定,而不是由代码所在的词法块决定

简单地在JSON对象的主体中使用
this
,并不意味着它引用正在构造的对象。它几乎肯定是指全局窗口对象

如果您希望能够使用
,您需要一个构造函数:

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

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

因为对象实际上还没有被实例化。但这将起作用:

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


您的代码不起作用,因为在创建对象文字(括号内的内容)时,对象还不存在,因此
未定义


这就像认为你可能是你自己的父亲,你在创造的那一刻并不存在。

因为
在那种背景下,这个
不是你正在构建的对象。哦,是的!当我构造
滑块
时,是否可以参考
滑块
我的分区
?我的意思是,我不想要一个
my_div
外部
slider
查看我的答案,了解如何使用构造函数正确使用
这个
(注意
new
关键字的使用),它是一个文本对象,而不是一个“JSON对象”。JSON是一种表示数据的文本格式,所以这个问题与JSON毫无关系。@wong2没关系。我认为你的问题很有趣,需要一个标题,以便其他人以后可以阅读,如果它适用于他们的话。实际上,这是关于“JavaScript对象文本内部的
的范围规则”的问题。是的,但是一个对新手更友好的标题可能吗?@tobyodavies JSON是一种数据交换格式,因此,如果您看到一些看起来像JSON的东西没有用于此目的,那么它可能不是。是的,JSON代表JavaScript对象表示法,但并不意味着JavaScript中的所有对象文字表示法都自动成为JSON。首先,JSON只是JavaScript中对象文本的子集。另一方面,问题中的具体示例不是有效的JSON,因为属性名不在引号中,即使在JavaScript中完全有效。
这个
不应该是未定义的,它应该是
窗口
对象。我说的不是保留字,而是它的含义。也许我应该说“未申报”
function Slider(id,tagName){
    this.div  = document.getElementById(id);
    this.divs = this.div.getElementsByTagName(tagName);
}

s = new Slider('slide','div')
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");