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

Javascript: How change function call params on the fly?

本文关键字:函数调用 参数 动态 何动态 Javascript      更新时间:2023-09-26

我正在从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改变函数调用参数。

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

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

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

任何想法?

您可以做的是遮蔽函数,以便能够更改第三个参数。您应该在获取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/

更改服务器。而不是返回

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

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

假设您不能更改从服务器发送过来的内容,您可以简单地使用正则表达式运行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"});

我不明白你在做什么,但一般来说,如果你不想依赖于参数的顺序,使函数接受一个参数,这是一个对象的属性是参数:

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来检查函数是否传递了你正在寻找的参数,然后再尝试访问它