我继承了一个代码库,我需要为我的工作更新它。我正在慢慢了解他们试图通过现有的关闭来完成什么,但是在尝试更新使用此功能的网站的一部分时我遇到了困难。我将给出代码试图完成的基本概述,看看是否有人可以提供帮助。
var TheObject = (function (){
var veryLargeDependantData = {
var1: {},
var2: {},
var3: [],
//Set these variables via functions
function1: function f1(data){...},
function2: function f2(data){...},
initialize: function initialize() { //set values for var1... var3}
};
return {initialize: veryLargeDependentData.initialize};
})().initialize();
因为我显然不能在站点上显示生产代码,所以必须这样做。但基本上 veryLargeDependentData 变量是函数的入口。当页面加载时,它会调用初始化函数,一切都很顺利。但是现在我需要将它添加到旧页面的 onclick 事件中,并且 firebug 控制台显示该变量未定义。在其他页面中,我可以毫无问题地使用它。
我的问题是发生了什么魔法导致闭包不属于这样的可调用命名空间的一部分。我是一个 javascript nOOb,所以如果这个问题听起来被误导了,我深表歉意。
onclick='TheObject.initialize();'
最佳答案
我假设您的意思是您想在点击事件处理程序中运行 initialize
函数,并且您目前正在尝试这样做:
TheObject.initialize();
如果是这样,问题是 TheObject
实际上指的是 initialize
的返回值,因为你在返回时调用了 initialize
立即调用的函数表达式的值。 initialize
很有可能返回 undefined
(很可能,它没有显式的 return
语句)。
要解决这个问题,您可能希望删除对 initalize
的立即调用,这将允许您在页面加载和其他任何地方使用上面显示的行。
关于Javascript 闭包返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16859930/