Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析$(document).ready(function(){})中的函数指针;按json字符串名_Javascript_Jquery - Fatal编程技术网

Javascript 解析$(document).ready(function(){})中的函数指针;按json字符串名

Javascript 解析$(document).ready(function(){})中的函数指针;按json字符串名,javascript,jquery,Javascript,Jquery,在我的$(文档)中有一个从服务器检索到的json对象,它有一个字符串,我想将该字符串解析为在$(document.ready(…)中定义的函数因此,例如: $(document).ready(function{ $.getJSON(/*blah*/,function(data){/*more blah*/}); function doAdd(left,right) { return left+right; } function doSub(lef

在我的
$(文档)中有一个从服务器检索到的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;

使用
eval
window[]()不好,因为函数可能在一段时间内不会被调用,基本上我想链接/解析,但还没有执行。

类似的东西怎么样

$(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请求检索的数据调用函数

将JSON更改为

{method: "doAdd", parameters : {"left":10,"right":20}}
那就做吧

var method = eval(json.method); 
// This doesn't call it. Just gets the pointer
或者(没有试过这个)

试试这个:

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

    });

您是说函数是在Javascript中定义的,而参数是在JSON中定义的,还是函数本身是在JSON中定义的?@kojiro-函数是在javascriptI添加的方法和参数键中定义的,因为否则您必须使用if语句检查键是什么。可能不是你想要的。@Amir-谢谢,这样做了,也澄清了我对
eval
-Frank的错误理解
这个
方法应该比
eval
更受欢迎。@Frank-不客气。kojira是正确的,因为eval会引发很多安全问题。我会尝试
这个
,但它不起作用,尽管我的感知可能被48盎司的咖啡模糊了。我想你的意思是
var func=this['funcName']
?这不是很清楚。如果我在一个函数中(即doAdd)。。。如果不调用它,从而使
getDo
变得多余,那么我是如何做到这一点的?因为我现在扩展了对自动执行函数的理解,我可以欣赏您所做的。。。意味着culpa@Frank好的,没问题,我希望你为另一个人工作来解决问题或其他情况
   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); });

    });