Javascript闭包返回undefined
Javascript closure is returning undefined
我继承了一个代码库,我需要为我的工作更新。我正在慢慢地了解他们试图用关闭来完成什么,但是当我试图更新使用这个功能的网站的一部分时,我被卡住了。我将给出代码试图完成的基本轮廓,看看是否有人可以提供帮助。
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变量是函数的入口。当页面加载时,它调用initialize函数,一切正常。但现在我需要将其添加到旧页面的onclick事件中,firebug控制台表示该变量未定义。在其他页面中,我可以毫无问题地使用它。
我的问题是,是什么魔法导致闭包不是这样的可调用命名空间的一部分。我有点javascript nOOb所以我道歉,如果这个问题听起来误导。
onclick='TheObject.initialize();'
我认为您的意思是要在单击事件处理程序中运行initialize
函数,并且您目前正在尝试这样做:
TheObject.initialize();
如果是这种情况,问题是TheObject
实际上指的是initialize
的返回值,因为您在立即调用的函数表达式的返回值上调用了initialize
。而且很有可能initialize
返回undefined
(很可能,它没有显式的return
语句)。
要解决这个问题,您可能需要删除对initalize
的立即调用,这将允许您在页面加载和其他任何地方使用上面所示的行。
在此代码中,TheObject
的值将是veryLargeDependentData.initialize()
方法返回的值。如果initialize方法没有返回任何值,则TheObject
为undefined。
一个简化的例子:
var TheObject = (function () {
return {
initialize: function () {
// stuff happens here, but importantly, there's nothing returned
}
}
})().initialize();
您可以将其分解为以下执行顺序:
// the value of step_one is a function that will return an object when it is run
var step_one = (function () {
return {
initialize: function () {
// ...
}
}
});
// after running the function step_one, step_two will be an object
// containing one key - initialize - which is a function
var step_two = step_one();
// since initialize doesn't return anything, TheObject is set to undefined.
var TheObject = step_two.initialize();
你可以通过将TheObject
设置为包含initialize方法的对象,然后在需要时再次运行该方法来解决这个问题。
var TheObject = (function () {
return {
initialize: function () {
}
}
})();
// initialize
TheObject.initialize();
// and again
TheObject.initialize();
请注意!
原作者可能希望initialize方法只运行一次。多次运行它可能会给系统带来bug !
似乎没有必要复杂,我不确定在这种情况下使用匿名函数和闭包获得了什么。有什么原因让你不能简单地做到以下几点吗?
var TheObject = {
var1: {},
var2: {},
var3: [],
//Set these variables via functions
function1: function(data){...},
function2: function(data){...},
initialize: function(){alert("initialize");}
};
var initButton = document.getElementById("initButtonName");
initButton.addEventListener("click", TheObject.initialize);
请注意,您需要删除内联事件。
- RequireJS向模块传递配置总是返回undefined
- JSON数组数据返回Undefined
- JavaScript”;.方法“;返回undefined
- jQuery可以't获取data-*属性值,返回undefined
- Javascript/JSON警报返回Undefined
- Javascript:firstChild对象返回undefined
- 使用在函数外部声明的变量的 Javascript 返回值 + undefined
- 当尝试使用ajax读取文件时,变量返回undefined
- 如何避免JSON.stringify在特殊情况下返回undefined,从而为JSON.parse创建字符串失败
- 使用谷歌地图:一个返回undefined的自定义javascript函数
- Json在nodeJs和AngularJs中返回undefined
- 为什么像 Firefox 和 Chrome 控制台中的 '}{' 这样的结构会返回 'undefined'?
- 使用 HTML 和 JavaScript 从表单访问值时返回 undefined
- 在 CoffeeScript 中,当尝试调用类中的方法 (@_methodName) 时,它会返回 undefined
- 解析承诺'当'返回undefined(Javascript)
- NodeJS:zlib.gunzip(body)错误地返回“undefined”
- window.open在chrome扩展中返回undefined
- javascript中的If/else不会为undefined返回else
- “undefined"返回而不是游戏名称
- 为什么“typeof false || undefined”返回"布尔值”;