Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过闭包检索变量的值_Javascript_Jquery_Closures - Fatal编程技术网

Javascript 通过闭包检索变量的值

Javascript 通过闭包检索变量的值,javascript,jquery,closures,Javascript,Jquery,Closures,我在网页的javascript中有以下模块模式: var swf_debugger=swf_debugger | |{}; (函数($,swf_调试器){ swf_debugger.pageSetup=(函数(){ 变量 swfType=null, formData={}, //…不重要的代码继续。。。 initChangeEvents=函数(){ $.each(formElements,function)(index,$el){ 如果($el.hasClass(“swfToLoad”)){ /

我在网页的javascript中有以下模块模式:

var swf_debugger=swf_debugger | |{};
(函数($,swf_调试器){
swf_debugger.pageSetup=(函数(){
变量
swfType=null,
formData={},
//…不重要的代码继续。。。
initChangeEvents=函数(){
$.each(formElements,function)(index,$el){
如果($el.hasClass(“swfToLoad”)){
//此事件是我分配给“swfType”的事件
$el.change(函数(){
swfType=$(“选项:选中”,this).val();
日志(“swfToLoad已触发”);
console.log(swfType);
});
返回;
}
//这些事件没有任何问题。。。
开关($el.prop(“标记名”)){
案例“选择”:
$el.change(函数(){
formData[$el.attr('id')]=$(“选项:选中”,this.val();
});
打破
案例“输入”:
开关($el.attr('type')){
案例“文本”:
$el.change(函数(){
formData[$el.attr('id')]=$(this.val();
});
打破
案例“复选框”:
$el.change(函数(){
formData[$el.attr('id')]=$(this.prop(“选中”);
});
打破
违约:
}
打破
违约:
}
});
},
init=函数(){
$(函数(){
addFormComponents();
populateDropdowns();
initCachedData();
initChangeEvents();
});
};
init();
返回{
swfType:swfType,
formData:formData
};
}());
}($,swf_);

本质上,我是将一个事件附加到一系列jqueryselected元素,回调只是将特定表单元素(特别是select、text和checkbox元素)的内容存储在变量或对象中


我知道我的事件连接正确,因为当我向它们添加
console.log
语句时,我可以看到它们正在启动。此外,每当我在控制台中调用
swf_debugger.pageSetup.formData
时,我都会看到每个事件所填充的对象的有效内容,因此这些事件都在做它们应该做的事情

每当我试图访问
swf_debugger.pageSetup.swfType
时,就会出现问题,它总是返回
null
,我不明白为什么。我知道提供此值的特定事件正在触发,并且我知道至少在回调的函数范围内,
swfType
是有效的,因为在我的
控制台.log
语句中返回了什么。但是,每当我试图通过闭包访问
swfType
的内容时(即在控制台中键入
swf_debugger.pageSetup.swfType
),它总是返回null

我猜我遇到了传递的对象引用和传递的变量值之间的差异,但我不确定。有人能帮我解释一下为什么
swfType
总是通过闭包返回
null

为什么swfType总是返回null

因为这是您分配给属性的值(从分配时具有该值的
swfType
变量中获取)。属性不是对指定给它的变量的引用-只能指定一个值

您可以做什么:

  • 使对象属性成为getter方法,该方法在调用局部
    swfType
    变量时返回该变量的值
  • 不要使用变量,但每次都要分配给
    swf\u调试器.pageSetup
    对象的属性

swf\u调试器.pageSetup.formData
不存在
formData
是一个私有变量。但是,您将它作为swf_debugger.passToSwf返回,那么有什么问题吗?抱歉,这是输入错误。。。修正了有意义的问题。。。我将接受你的建议。