我已经阅读了几个小时,似乎找不到适合我需要的答案。由于代码的大小,我现在不想更改结构。如果可能的话,我正在尝试在我已经建立的结构内找到一个可行的解决方案。
首先,这是我的对象字面量结构的一个非常简化的模型:
NS =
{
x: undefined,
button: undefined,
fn:
{
root: undefined,
doSomething: function ()
{
var root = this.root,
x = root.x; // exception occurs here
// do something with x
}
},
init: function ()
{
var self = this,
x = self.x,
button = self.button,
fn = self.fn,
fn.root = self;
x = $("#x");
button = $("#button");
button.on("click", fn.doSomething);
}
};
我知道看起来下面的声明init()
并不是真正需要的,但是命名空间可能会变得相当长,所以我喜欢这样缩短它们。在我遇到这个障碍之前,这几乎在所有情况下都对我很有效。我知道我可以完全限定所有内容并且它应该可以工作,但由于前面提到的长命名空间,我真的不想这样做。
我的问题是,当从另一个属性的函数中访问它时,我的根属性x
在函数中设置后没有保留其值。init()
你可以console.log(this.x)
从init()
函数内部,它就在那里。但是,当您单击按钮并且 onClick 函数尝试声明x = root.x
它时会抛出:
未捕获的类型错误:无法读取未定义的属性“x”
更新:
即使在调用处理程序之前添加未定义的console.log()
节目:fn.root.x
init: function ()
{
var self = this,
x = self.x,
button = self.button,
fn = self.fn,
fn.root = self;
x = $("#x");
console.log(x); // this shows the object
console.log(fn.root.x); // this throws the undefined exception
button = $("#button");
button.on("click", fn.doSomething);
}