我正在使用jQuery编写一些Javascript代码,以在浏览器中显示特殊格式的小部件。我已经取得了成功,但现在我正在努力重构我的代码有两个原因。
(1)我希望能够轻松地多次使用窗口小部件,并且每个窗口都有一个Javascript对象。
(2)我希望以正确的方式做到这一点,这样我的代码完全可以重复使用,并且对于具有各种对象和函数的全局命名空间并不多。
我遇到了一个范围问题,我希望解决问题并提高我对Javascript范围的理解。我把这个问题简化为一个很小的代码片段,说明了我在做什么:
function getMyObject() {
var theObject = {
doThis: function () { },
doThat: function () { },
combinations: {
doThisTwice: function () { doThis(); doThis(); },
doThatTwice: function () { doThat(); doThat(); }
}
};
return theObject;
}
var myObject = getMyObject();
myObject.combinations.doThisTwice();
我已经声明了一个返回对象的函数。
但是,当我尝试执行函数combinations.doThisTwice()
时,程序会抛出一个错误,指出doThis()
超出了范围。如何在doThis
范围内引用函数combinations.doThisTwice
?
更新:非常感谢您回答我的问题:在doThis()
函数中将theObject.doThis()
替换为doThisTwice()
。这有效,但我不明白为什么。
我原以为名称theObject
在对象声明结束之前无效。我想我必须误解Javascript的一些基本方面......可能是因为类似C语法。
答案 0 :(得分:2)
doThis
未在函数范围中定义,因此它将遍历范围链,但找不到它。
您可以通过
引用它theObject.doThis();
但是,如果您定义这样的函数,可能会更具可读性:
function getMyObject() {
function doThis() {};
function doThat() {};
var theObject = {
doThis: doThis,
doThat: doThat,
combinations: {
doThisTwice: function () { doThis(); doThis(); },
doThatTwice: function () { doThat(); doThat(); }
}
};
return theObject;
}
但在这种情况下,每当您从外部更改doThis
时,doThisTwice
仍将引用原始功能。
答案 1 :(得分:2)
你需要这样做:
function getMyObject() {
var theObject = {
doThis: function () { },
doThat: function () { },
combinations: {
doThisTwice: function () { theObject.doThis(); theObject.doThis(); },
doThatTwice: function () { theObject.doThat(); theObject.doThat(); }
}
};
return theObject;
}
var myObject = getMyObject(); myObject.combinations.doThisTwice();
从外部作用域引用'theObject'以调用内部对象中的函数。
答案 2 :(得分:0)
在doThisTwice
中,使用theObject.doThis();
代替doThis();