嵌套Javascript对象时的作用域问题
我正在编写一些Javascript代码,使用jQuery在浏览器中显示特殊格式的小部件。我已经取得了成功,但现在我正致力于重构我的代码,原因有两个 (1) 我希望能够多次轻松地使用该小部件,并有一个Javascript对象引用每个小部件。嵌套Javascript对象时的作用域问题,javascript,scope,Javascript,Scope,我正在编写一些Javascript代码,使用jQuery在浏览器中显示特殊格式的小部件。我已经取得了成功,但现在我正致力于重构我的代码,原因有两个 (1) 我希望能够多次轻松地使用该小部件,并有一个Javascript对象引用每个小部件。 (2) 我希望以正确的方式来实现这一点,这样我的代码就可以完全重用,并且不会缺少包含各种对象和函数的全局名称空间 我有一个作用域问题,我希望解决这个问题并提高我对Javascript作用域的理解。我已将此问题浓缩为一个小代码段,说明了我在做什么: func
(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();
我声明了一个返回对象的函数
但是,当我尝试执行函数combines.dothiswice()
时,程序抛出一个错误,指出doThis()
超出范围。如何引用组合范围内的函数doThis
。doThisTwice
更新:感谢您回答我的问题:将函数doThis()
中的object.doThis()
替换为doThis()
。这行得通,但我不明白为什么
我本以为在对象声明结束之前,对象的名称
theObject
是无效的。我想我一定误解了Javascript的一些基本方面。。。可能是因为类似C的语法。这不在函数作用域中定义,因此它将遍历作用域链,但找不到它
你可以通过
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
,dothiswice
仍将引用原始函数。在dothiswice
中,使用对象.doThis()代码>而不是doThis()代码>您需要执行以下操作:
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.compositions.doThisTwice()
从外部作用域引用“theObject”来调用内部对象中的函数。是的,JS就是这样。谷歌搜索Javscript范围和闭包。您将更好地了解作用域的工作原理。尝试使用原型从对象继承,或者将对象复制到另一个变量,这样它就不再工作了。如果只是通过变量引用对象,为什么首先需要这个
?