簡體   English   中英

從字符串調用javascript函數

[英]Invoke javascript function from string

我的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/

是的,有一種簡單(但可能稍微凌亂)的方法,你可以做到這一點,而不會使函數對全局對象可見:

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

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

請注意,我將delete更改為deleter ,因為delete是保留關鍵字...

像這樣的東西會起作用:

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 ,外界init功能全,和附加的sendfinishdelete功能的自我,你可以使用self[action]語法從內init -function

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();

這應該工作!!

即使您僅使用init屬性返回一個對象,並且您動態填充其余對象以使您的模塊使用它們,您仍然可以在運行時將它們顯示在外部。 任何想要調試模塊的人都可以輕松找到他們。

您仍然可以在運行時創建匿名方法,並且它們也可以與其實現一起顯示。

在你的代碼示例中,“ 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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM