我有一个全局对象SomeObj
(使用揭示模块模式),在//url/to/js/file.js
中定义
SomeObj
包含两个setter方法:SomeObj.setX()
和SomeObj.setY()
,在SomebObj
内部设置一些私有变量(X和Y)。除非通过我通过显示模块模式公开的这些set方法,否则无法访问私有变量X和Y.
我有另一个名为SomeObj.render()
的方法,它使用X和Y变量。
所以,这是场景。另一位开发人员将在第三方回调函数中调用SomeObj.render()
。
function thirdPartyCallbackFunction() {
$.getScript("//url/to/js/file.js", function() {
SomeObj.render();
});
}
此代码位于专有CMS中。但是,在用例中,我们的用户应该能够调用SomeObj.setX()
和SomeObj.setY()
来设置SomeObj.render()
所需的变量。但是,由于CMS的设计方式,用户无权修改function thirdPartyCallbackFunction()
所在的内容区域。
事实上,可以调用SomeObj.setX()
和SomeObj.setY()
的内容区域可以位于function thirdPartyCallbackFunction()
之前或之后。如果内容区域位于function thirdPartyCallbackFunction()
之前,则尚未定义SomeObj
,并且会发生错误。
有没有办法在定义.setX()
之前调用.setY()
和SomeObj
?或者我应该采用另一种方法吗?
答案 0 :(得分:1)
假设您无法控制CMS输出,可能以下内容可能有所帮助。
在窗口对象中设置“X”和“Y”变量。
window.MyArguments = {};
window.MyArguments.X = 'whatever_is_x';
window.MyArguments.Y = 'whatever_is_y';
执行回调后,如果存在“MyArguments”,则可以更新值并调用渲染。
function render() {
if(window.MyArguments && window.MyArguments.X && window.MyArguments.Y) {
SomeObj.setX(window.MyArguments.X);
SomeObj.setY(window.MyArguments.Y);
SomeObj.render();
} else {
//Set a time-out and call the same function again.
}
}
你可以在你的回调中调用这个新的“渲染”功能。
function thirdPartyCallbackFunction() {
$.getScript("//url/to/js/file.js", function() {
render();
});
}
您也可以尝试相反的方法,在调用其上的方法之前检查SomeObj是否可用,然后设置超时(如果它尚不可用)。
还可以选择“密封”和“开封”模式,以便部分更新模块的定义。
答案 1 :(得分:1)
我给了Serendipity这个答案的功劳。根据Serendipity关于使用全局变量的答案,我决定改为创建一个全局函数声明。
function configureSomeObj() {
SomeObj.setX();
SomeObj.setY();
}
尽管在读取此函数时可能尚未定义SomeObj,但在调用此函数之前,不会对此函数进行全面评估。
我调整了第三方回调:
function thirdPartyCallbackFunction() {
$.getScript("//url/to/js/file.js", function() {
configureSomeObj();
SomeObj.render();
});
}
现在,configreSomeObj()
可以在thirdPartyCallbackFunction()
之前或之后的页面上的任何位置。这确实引入了一个全局函数,但其中的代码是有组织的。