在函数vs闭包内明确地定义变量

时间:2014-05-23 09:52:47

标签: javascript

我有' phone_dlg_manager'构造函数及其私有方法showinit_country_code_combobox。对话框引用保存在phone_dlg变量中。 show方法会触发init_country_code_combobox,我有两个选择:

1)明确传递country_combobox方法所需的变量init_country_code_combobox

function phone_dlg_manager(ctx, open_dlg_button, edit_ctrl, item)
{
    var phone_dlg;
    show();
    function show()
    {
        phone_dlg = ctx.application.ui.create_dialog(0, "PhoneEditorDlg");
        init_country_code_combobox(phone_dlg.country);
        read_to_dialog_controls(this._form_item);
        phone_dlg.visible = true;
    }

    function init_country_code_combobox(country_combobox)
    {       
        country_combobox.items.clear();
        country_combobox.items.start_adding();
        country_combobox.items.finish_adding();
    }
}

2)由于phone_dlg可通过闭包访问init_country_code_combobox,因此我可以访问我需要的属性而无需显式传递变量:

function phone_dlg_manager(ctx, open_dlg_button, edit_ctrl, item)
{
    var phone_dlg;
    show();
    function show()
    {
        phone_dlg = ctx.application.ui.create_dialog(0, "PhoneEditorDlg");
        init_country_code_combobox(phone_dlg.country);
        read_to_dialog_controls(this._form_item);
        phone_dlg.visible = true;
    }

    function init_country_code_combobox()
    {       
        var country_combobox = phone_dlg.country;
        country_combobox.items.clear();
        country_combobox.items.start_adding();
        country_combobox.items.finish_adding();
    }
}

第二个选项在阅读代码时似乎更容易理解,但它使init_country_code_combobox函数知道的比它需要的多。我应该选择哪个选项? 感谢

1 个答案:

答案 0 :(得分:1)

这主要是风格问题。选项1更简洁,更具可扩展性,因为您可以使用init_country_code_combobox()初始化多个对话框。但如果不太可能这样做,选项2并非不合理。