Javascript:如何动态更改函数调用参数
Javascript: How change function call params on the fly?
我正在从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来检查函数是否传递了你正在寻找的参数,然后再尝试访问它
相关文章:
- 具有多个参数的checkbox函数调用
- 如何通过 Function.prototype.apply() 更改调用函数的参数
- 使用评估函数调用 javascript 函数作为文本框 Asp.net 参数
- 传递php字符串作为php脚本中调用的javascript函数的参数
- 是 Javascript 中可用于匿名调用函数的参数计数
- 如何在事件处理程序中包含函数(及其参数),而不在页面加载时调用该函数
- 循环变量作为异步函数调用中的参数
- JavaScript 函数调用将 x && y 作为参数传递
- 如何使用一些变量参数从javascript函数调用 asp.net C#函数并从C#函数获取字符串返回
- 不理解此函数调用中的参数
- 将一个函数作为参数传递给另一个函数,每次调用函数时检查返回值
- 当我们在数组中有函数的参数时,如何调用函数
- 如果我有一个变量,分配给函数调用的值,如果函数调用的参数更改,是否可以更新该变量
- 防止单击和检索函数调用的参数
- 我可以通过beforeSent事件更改jQuery.ajax的函数调用参数(在数据中发送)吗?
- 创建一个新函数并从另一个函数调用参数
- 如何将变量传递给属于函数调用参数一部分的函数
- 从函数调用参数
- Javascript:如何动态更改函数调用参数
- CoffeeScript函数调用-参数和括号