通过闭包检索变量的值

时间:2013-06-03 22:54:35

标签: javascript jquery closures

我在网页的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选定元素,回调只是将特定表单元素的内容(特别是select,text和checkbox元素)存储在变量或对象中。

我知道我的事件是正确附加的,因为当我向他们添加console.log语句时,我可以看到它们被触发。此外,每当我在控制台中调用swf_debugger.pageSetup.formData时,我都会看到每个事件都填充的对象的有效内容,因此这些事件正在按照它们的预期进行。

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

我猜我正在考虑传递的对象引用和传递的变量值之间的区别,但我不确定。有人可以帮助我,并解释为什么swfType总是通过关闭返回null

1 个答案:

答案 0 :(得分:1)

  

为什么swfType总是返回null

因为这是您分配给属性的值(来自swfType变量,该变量在赋值时具有该值)。属性不是对分配给它的变量的引用 - 您只能分配一个值。

你能做什么:

  • 使object属性成为一个getter方法,只要调用它就会返回本地swfType变量的值
  • 不要使用变量,而是每次都分配给swf_debugger.pageSetup对象的属性