3

我的 javascript 模块中有以下代码,但这需要我使这些函数对外界可见。

var mymodule = function() {
    var self = null,
        init = function () { 
            self = this; 
            $('.actionButton').click(function () {
        var worklistId = $(this).data('worklistid'),
            action = $(this).data('action');
        self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
            })
        },
        send = function () {
             // some logic
        },
        finish = function () {
             // some logic
        },
        delete = function () {
             // some logic
        };

    return {
        init: init,
        send: send,
        finish: finish,
        delete: delete
    };
}();

mymodule.init();

所以我唯一想在我的模块中返回的是 init 函数。但是,当我这样做时,我无法调用函数,因为对象(自身)仅包含在外部可见的 init 函数。

return {
    init: init
};

有没有任何解决方案可以像这样调用我的函数而不让它们对外界可见?请不要使用 if else 语句,因为我的工作流程比本示例中的 3 个操作要大。我想让我的模块尽可能封闭,因为这减少了依赖关系。

更新

这是一个更新的jsfiddle,其中一个建议的解决方案,但是这给了我另一个问题。http://jsfiddle.net/marcofranssen/bU2Ke/

4

5 回答 5

0

在您的代码示例中,“”到底是什么含糊不清self。您应该保持简单,将封装函数用作“私有”方法并返回可以访问它们的“公共”(或 Crockford 称之为“特权”)函数。

这是使用私有函数和变量进行单例的 YUI 方式。示例模式:

var mymodule = (function() {
    var internal = {
        'send': function() {},
        'finish': function() {},
        'delete': function() {}
    };
    return {
        'init': function(action) {
            // access to internals, f.ex:
            if ( internal.hasOwnProperty(action) ) {
                 internal[action].call(this); // bring the caller context
            }
         }
    };
}());

mymodule.init('send');
于 2012-09-04T12:12:55.970 回答
0
var mymodule = function() {
  var self = {},
     init = function () {  
        $('.actionButton').click(function () {
    var worklistId = $(this).data('worklistid'),
        action = $(this).data('action');
    self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
        })
    };
    self.send = function () {
         // some logic
    };
    self.finish = function () {
         // some logic
    };
    self.delete = function () {
         // some logic
    };
    return{
      init:init
    }
}();

mymodule.init();

这应该工作!

于 2012-09-04T11:40:09.613 回答
0

是的,有一种简单(但可能有点混乱)的方法可以做到这一点,而无需使函数对全局对象可见:

var privateFunctions = { deleter: deleter, send: send};

然后,而不是self[action]();,只是做privateFunctions[action]();,你很高兴。

请注意,我更改deletedeleter,因为delete是保留关键字...

于 2012-09-04T11:23:52.303 回答
0

像这样的东西会起作用:

var mymodule = function() {
        var self = this;
        init = function () { 

            $('.actionButton').click(function () {
        var worklistId = $(this).data('worklistid'), action = $(this).data('action');
        self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
            })
        }
        self.send = function () {
            console.log('send');
        }
        self.finish = function () {
            console.log('finish');
        }
        self.delete = function (item) {
            console.log('delete');
        };

    return {
        init: init,
    };
}();

mymodule.init();​

这是小提琴:

http://jsfiddle.net/yngvebn/SRqN3/

通过将self-variable 设置为this, 在 -function 之外,并将,和函数init附加到 self ,您可以使用-function内部的语法sendfinishdeleteself[action]init

于 2012-09-04T11:24:05.930 回答
0

即使您仅使用 init 属性返回一个对象并动态填充其余对象以使您的模块使用它们,您仍然会在运行时使它们对外部可见。任何想要调试您的模块的人都可以轻松找到它们。

您仍然可以在运行时创建匿名方法,并且它们也将与它们的实现一起可见。

于 2012-09-04T11:42:56.267 回答