Javascript:如何更改函数动态调用params?

时间:2011-07-18 16:59:00

标签: javascript jquery method-call

我从jquery的json调用中收到一些'body'内容,在那里我可以通过执行以下操作返回唯一的javascript元素:

script_element = $(data.body)[1]

这相当于:

<script type=​"text/​javascript">​
    updater('foo', 'bar', {}, '0', constant='');
</script>​

因此,typeof script_element会返回"object"

而且,如果我运行script_element.innerText,我可以得到:

updater('foo', 'bar', {}, '0', constant='');

收到此脚本后,我现在正在做的就是在其上运行eval,但搜索我无法运行eval更改函数调用参数。< / p>

我要做的是更改调用的third参数,在这种情况下是{},可以根据json调用的返回而改变,所以我不能只需搜索{}

我也可以做script_element.text.split(',')[2]例如,并动态更改此文本,但我认为应该有更好的方法来做到这一点。

我不知道javascript是否可以识别和处理“未来的方法调用”,但仍然认为应该有更好的方法。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

你可以做的是遮蔽函数,以便能够改变第三个参数。你应该在获取JSON之前定义该阴影函数。

var originalUpdater = updater; // keep old function to call

// overwrite (shadowing)
updater = function(a, b, c, d, e) {
    // change c appropriately here
    originalUpdater(a, b, c, d, e);
}

然后你仍然只能eval它(这不是很安全,但如果我没有误,那不是你的意思),它会调用阴影函数。


更通用的阴影方法将遵循:

var originalUpdater = updater; // keep old function to call

// overwrite (shadowing)
updater = function() {
    // change arguments[2] appropriately here
    originalUpdater.apply(this, arguments);
}

小提琴:http://jsfiddle.net/n7dLX/

答案 1 :(得分:3)

更改服务器。而不是返回

<script type=​"text/​javascript">​
    updater('foo', 'bar', {}, '0', constant='');
</script>​

返回

{
  "method": "updater",
  "params": [
    "foo", "bar", {}, "0", ''
  ]
}

答案 2 :(得分:2)

假设您无法更改从服务器发送的内容,您只需使用正则表达式运行innerText并在插入之前传递更新HTML。

var replacer = /\w+\(([^()]+)\)/gi;
script_element.innerText.replace(replacer, function(matched_text, func_params){
    var orig_func_params = func_params;
    // Make changes to func_params here.
    return matched_text.replace(orig_func_params, func_params);
});

通过执行以下操作可以实现此功能:

var replacer = /\w+\(([^()]+)\)/gi;
function replace_arg(script_element, arg_index, replacement_value) {
    script_element.innerHTML = script_element.innerHTML.replace(replacer, 
    function(matched_text, func_params){
        var orig_func_params = func_params;
        func_params = func_params.split(",");
        if (arg_index >= func_params.length) {
             throw new RangeError(arg_index + " is out of range. Total args in function:" + func_params.length);
        }
        func_params[arg_index] = JSON.stringify(replacement_value);
        return matched_text.replace(orig_func_params, func_params.join(","));
    });
return script_element;
}

可以这样调用:

script_element = replace_arg(script_element, 3, {"new":"arg"});

答案 3 :(得分:0)

我不明白你在做什么,但一般来说,如果你不想依赖参数的顺序,那么使该函数采用一个参数,该参数是一个属性为参数的对象:

function add(params) {
    var a = params.hasOwnProperty("paramA") ? params.paramA : 0;
    var b = params.hasOwnProperty("paramB") ? params.paramB : 0;
    return a + b;
}

add({paramA: 1, paramB: 2});

在这种情况下,您应该使用hasOwnProperty来检查函数是否在尝试访问之前传递了您要查找的参数。