【问题标题】:How to run a JavaScript function that is inside a namespace如何运行命名空间内的 JavaScript 函数
【发布时间】:2011-12-04 11:06:26
【问题描述】:

如果我有类似的东西:

App = {
    editingMode: function ()
    {
        function setEditingMode(entityID) {
            $('#editingMode').val('1');
            $.ajax({
                type: "POST",
                url: "/Organisations/Manage/LockEntity/",
                data: "entityID=" + entityID
            });
        }
        function setEditingModeOff(entityID) {
            if ($("#myform").valid() == true)
            {
                $('#editingMode').val('0');
                $.ajax({
                    type: "POST",
                    url: "/Organisations/Manage/UnlockEntity/",
                    data: "entityID=" + entityID
                });
            }
        }
    }
};

我将如何运行其中一个内部函数?

App.editingMode(); 但是我该怎么做才能到达setEditingMode ??

【问题讨论】:

  • AFAIK 这些功能实际上是私有的,你不能。

标签: javascript


【解决方案1】:

您可以使用不同的结构来完成您想要的。我不知道它是否会破坏你正在使用的其他东西,所以我只是给你一个例子。我不确定这是实际的解决方案,请看一下并告诉我这是否不是您需要的。 如果你使用:

 var App = {
                editingMode:
                {
                    setEditingMode: function(entityID) {
                        $('#editingMode').val('1');
                        $.ajax({
                            type: "POST",
                            url: "/Organisations/Manage/LockEntity/",
                            data: "entityID=" + entityID
                        });
                    },
                    setEditingModeOff: function(entityID) {
                        if ($("#myform").valid() == true)
                        {
                            $('#editingMode').val('0');
                            $.ajax({
                                type: "POST",
                                url: "/Organisations/Manage/UnlockEntity/",
                                data: "entityID=" + entityID
                            });
                        }
                    }
                }
            };

你可以像这样调用editingMode的方法:

App.editingMode.setEditingModeOff(1);

请注意,它们仍将被封装在 App 中,您不必将它们移动到全局范围内。

【讨论】:

  • 我想这会奏效。但这几乎让我想知道为什么要打扰命名空间:/
  • 它总是有用的,我不认为我可以列出评论中允许的字符数的好处。当您有一个包含数十个对象和数十种方法等的大型项目时,您会喜欢命名空间:)
【解决方案2】:

您需要返回一个引用或以其他方式使其可从函数外部访问,例如,将其附加到 window(实际上使其成为全局)或 App 对象。

【讨论】:

  • @Cameron 命名空间仍然是个好主意。最好只有App global 然后有几十个全局函数、对象等。
【解决方案3】:

虽然“Nikoloff”给出的答案使您能够调用这些函数,但我会指出一些不同(可能更好)的方法。 遵循“模块”模式概念不仅可以有效地解决您的问题,还可以让您拥有私有变量。 (搜索“Javascript 中的模块模式”,它会为您提供大量在线资源。)

App = {
    editingMode: function ()
    {       
        // Below var is no way directly accessible and act as private var
        var privateVar =5;
        // Below function is going to give access to private var
        function getPrivateVar(){
            return privateVar;
        }
        //Your functions - untouched
        function setEditingMode(entityID) {
            $('#editingMode').val('1');
            $.ajax({
                type: "POST",
                url: "/Organisations/Manage/LockEntity/",
                data: "entityID=" + entityID
            });
        }
        function setEditingModeOff(entityID) {
            if ($("#myform").valid() == true)
            {
                $('#editingMode').val('0');
                $.ajax({
                    type: "POST",
                    url: "/Organisations/Manage/UnlockEntity/",
                    data: "entityID=" + entityID
                });
            }
        }
        return {
            setEditingMode: setEditingMode,
            setEditingModeOff: setEditingModeOff,
            getPrivateVar: getPrivateVar
        }
    }
};

App.editingMode().setEditingMode();
console.log(App.editingMode().getPrivateVar());

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 2018-09-14
    • 2013-11-19
    • 2013-09-28
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2015-03-05
    • 2012-06-13
    相关资源
    最近更新 更多