0

我在网页的 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通过关闭返回。

4

1 回答 1

1

为什么 swfType 总是返回 null

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

你可以做什么:

  • 使对象属性成为 getter 方法,该方法在swfType调用时返回局部变量的值
  • 不要使用变量,而是swf_debugger.pageSetup每次都分配给对象的属性
于 2013-06-03T23:02:25.447 回答