我在网页的 javascript 中有以下模块模式:
var swf_debugger = swf_debugger || {};
(function($, swf_debugger) {
swf_debugger.pageSetup = (function() {
var
swfType = null,
formData = {},
// ... unimportant code continues ...
initChangeEvents = function() {
$.each(formElements, function(index, $el) {
if ($el.hasClass("swfToLoad")) {
// THIS EVENT IS WHERE I MAKE THE ASSIGNMENT TO 'swfType'
$el.change(function() {
swfType = $("option:selected", this).val();
console.log("swfToLoad has triggered");
console.log(swfType);
});
return;
}
// NO ISSUES HERE WITH THESE EVENTS...
switch($el.prop("tagName")) {
case "SELECT":
$el.change(function() {
formData[$el.attr('id')] = $("option:selected", this).val();
});
break;
case "INPUT":
switch ($el.attr('type')) {
case "text" :
$el.change(function() {
formData[$el.attr('id')] = $(this).val();
});
break;
case "checkbox" :
$el.change(function() {
formData[$el.attr('id')] = $(this).prop("checked");
});
break;
default:
}
break;
default:
}
});
},
init = function() {
$(function() {
addFormComponents();
populateDropdowns();
initCachedData();
initChangeEvents();
});
};
init();
return {
swfType: swfType,
formData: formData
};
}());
}($, swf_debugger));
本质上,我将事件附加到一系列 jquery 选定元素,回调只是将特定表单元素(特别是选择、文本和复选框元素)的内容存储在变量或对象中。
我知道我的事件正确附加,因为当我console.log
向它们添加语句时,我可以看到它们触发。此外,每当我swf_debugger.pageSetup.formData
在控制台中调用时,我都会看到每个事件正在填充的对象的有效内容,因此这些事件正在做它们应该做的事情。
每当我尝试访问swf_debugger.pageSetup.swfType
它时,我的麻烦就会发生,它总是会返回null
,我不明白为什么。我知道提供此值的特定事件正在触发,并且我知道至少在回调的函数范围内swfType
是有效的,因为我的console.log
语句中返回了什么。但是,每当我尝试swfType
通过闭包访问内容时(即swf_debugger.pageSetup.swfType
在控制台中输入),它总是返回 null。
我猜我遇到了传递的对象引用和传递的变量值之间的区别,但我不确定。有人可以在这里帮助我并解释为什么swfType
总是null
通过关闭返回。