从字符串调用javascript函数

时间:2012-09-04 11:18:46

标签: javascript jquery

我的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函数。但是当我这样做时,我无法调用这些函数,因为对象(self)只包含外部可见的init函数。

return {
    init: init
};

是否有任何解决方案可以调用我的功能,而不会让外界看到它们?请不要if else语句,因为我的工作流程比本例中的3个动作大。我想让我的模块尽可能关闭,因为这会减少依赖性。

更新

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

5 个答案:

答案 0 :(得分:0)

是的,有一种简单(但可能稍微凌乱)的方式,你可以做到这一点,而不会使全局对象的功能可见:

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

然后,而不是self[action]();,只需privateFunctions[action]();,你就可以了。

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

答案 1 :(得分: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 - 变量设置为this,位于init - 函数之外,并附加sendfinishdelete函数自我,您可以使用self[action] - 函数

中的init语法

答案 2 :(得分: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();

这应该工作!!

答案 3 :(得分:0)

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

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

答案 4 :(得分: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');