我的$(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;
使用eval
或window[]();
并不好,因为函数可能暂时无法调用,基本上我想链接/解析但尚未执行。
答案 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); });
});