在$(document).ready(function(){})中解析函数指针;通过json字符串名称

时间:2011-03-01 00:52:27

标签: javascript jquery

我的$(document).ready(...);中有一个从服务器检索到的json对象,它有一个字符串我想要解析为$(document).ready(...);中定义的函数,例如:

$(document).ready(function{

    $.getJSON(/*blah*/,function(data){/*more blah*/});
    function doAdd(left,right) {
        return left+right;
    }
    function doSub(left,right) {
        return left-right;
    }
});

使用json字符串:

{"doAdd":{"left":10,"right":20}}

我想到的一种方法是在加载json之前创建函数的关联数组:

var assocArray=...;
assocArray['doAdd'] = doAdd;
assocArray['doSub'] = doSub;

使用evalwindow[]();并不好,因为函数可能暂时无法调用,基本上我想链接/解析但尚未执行。

3 个答案:

答案 0 :(得分:2)

将您的JSON更改为

{method: "doAdd", parameters : {"left":10,"right":20}}

然后做

var method = eval(json.method); 
// This doesn't call it. Just gets the pointer

或(尚未尝试过)

var method = this[json.method]

答案 1 :(得分:0)

这样的事情怎么样?

$(function(){
    // Function to be called at later date
    var ressolvedFunc = null;

    // Ajax call
    $.getJSON(/*blah*/,function(data){
        // Generate one function from another
        ressolvedFunc = (function(data) {
            var innerFunc;
            var left = data.left;
            var right = data.right;

            // Detect action
            for (action in data) {
                if (action == "doAdd")
                    innerFunc = function() {
                        return left + right;
                    };
                else
                    innerFunc = function() {
                        return left - right;
                    };
            }

            return innerFunc;
        })(data);
    });
});

匿名函数返回新函数,新值存储在机箱中。这应该允许您在以后使用先前从GET请求中检索的数据调用该函数。

答案 2 :(得分:0)

试试这个:

   var doX = (function() {

        var 
           data = [],
           getDo = function(action) {

               for(var d in data) {
                   if (data[d][action]) {
                       return data[d];
                   }
               }

               return null;  
           };

        return {
             set: function(sdata) {
                 data.push(sdata);
             },
             doAdd: function() {
                 var add = getDo("doAdd");

                 if (!add)
                     return 0;

                 return add.doAdd.left + add.doAdd.right;
             },
             doSub: function() {
                 var sub = getDo("doSub");

                 if (!sub)
                     return 0;

                 return sub.doAdd.left + sub.doAdd.right;
             }
       };

    })();

   $(document).ready(function{

        $.getJSON(/*blah*/,function(data){ doX.set(data); });

    });