将参数作为不带.apply()的数组传递
Passing arguments as an array without .apply()
我正在尝试找出是否有一种方法可以将参数作为数组传递给javascript函数,而不使用.apply方法。从用户的角度来看,代码看起来像这样:
var args = [1, 2, 3, 4];
doSomething(args);
请注意,doSomething()
并不总是相同的函数,所以我不能将其编写为使用参数数组。理想情况下,这应该适用于任何函数,我想我要做的基本上是将数组转换为类似参数数组的对象。
我在想,我可能可以设置这样的函数参数对象:
function.arguments = otherArguments;
但我不知道我什么时候必须这样做(在函数开始执行后,但在它真正对其参数做任何事情之前,我不是必须以某种方式这样做吗?)
我之所以尝试这样做,是因为我试图编写自己的.apply函数用于学习目的。这可能吗?
不,没有办法。一个工具代表一个功能,可供选择的工具是apply
。
如果您需要编写自己的不使用apply
的函数,则需要使用eval:
function apply(fn, thisObj, args) {
var obj = {fn: fn};
var str = "obj.fn(";
for (var i=0; i<args.length; i++)
str += (i?',':'') + "args["+i+"]";
str += ");";
return eval(str);
}
我根本不建议这样做,但如果你想疯了,你可能会为你正在调用的函数的arity动态生成一个curry方法,然后在循环中调用结果curry:
function func(a,b,c,d) {
console.log([a,b,c,d]);
return "Return Value";
}
// Using a static 4 argument curry.
function curry4(f) {
return function(a) {
return function(b) {
return function(c) {
return function(d) {
return f(a,b,c,d);
}
}
}
}
}
var args = [1,2,3,4];
for(var i=0,f=curry4(func);i<func.length;i++) { f = f(args[i]); }
console.log(f); // f is return value of `func`
请参阅此处的示例,该示例最多支持12个可选参数。
但这条路可能会导致疯狂。。。。
仅举一例:
如果使用setTimeout,则可以传递params:
setTimeout( _function_name_, delay, param1,param2,param3...)
通过这种方式,参数被传递到函数,而不使用apply
相关文章:
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 在lodash上有没有一个替代方案.merge.apply(_,x);其中x是对象的数组
- 将参数作为不带.apply()的数组传递
- $.when.apply 根据输入数组的长度返回具有不同结构的结果
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 使用数组-apply()中的参数调用函数,但不使用上下文参数
- 我正在使用 $scope.$apply 在 http 调用后更新对象数组.谁能告诉我正确的方法
- 如果我在数组前面加上 ng-repeat,除非我更改浏览器窗口,否则$apply不会呈现 ng-repeat
- $when.apply在promise数组中的某个promise被延迟时不工作
- Chrome:如何解决Math.max.apply(Math,数组)上的“超出最大调用堆栈大小”错误
- Javascript:如何使用apply方法传递参数数组,然后在被调用的函数中访问它
- $when.apply不计算数组中任何已定义的函数
- 重用传递给.apply()的数组是否安全
- 在Javascript中使用Math.min.apply()获取数组的最小值返回NaN
- 如何让AngularJS更新DOM上的ng-repeat数组拼接?$scope.$apply()返回一个错误