我正在尝试重新实施申请。我想出了一个天真的解决方案,通过在对象的上下文中临时修改该函数然后删除它来在对象的上下文中执行函数。但是当我调用它时,我无法弄清楚如何传递fn逗号分隔的参数,因为它们是数组形式。
如何将数组转换为逗号分隔的变量WITHOUT apply,call或bind?
function apply(fn, context, args) {
context.fn = fn;
var result = context.fn();
delete context.fn;
return result;
}
function add(a,b) {
return a + b + this.num;
}
console.log(apply(add, {num: 10}, [3, 4])); //17
编辑:
我不希望我的值分成一个字符串。我希望我的值分为comma separated form。当你传递一个数组时,这基本上就是apply所做的事情。
答案 0 :(得分:1)
尝试以下方法:
[1,2,3,4,5].join(",")
答案 1 :(得分:1)
您可以在spread operator:
的帮助下在ES6中执行此操作 private User search_user(String username) {
if(users == null){
return new UserNotFound();
}
for(int i = 0; i < this.users.size(); i++) {
User found_user = this.users.get(i);
if(found_user.username.equals(username))
return found_user;
}
return new UserNotFound();
}
在撰写本文时,FF37和转发器(例如Traceur和Babel)支持此功能。
另一种方法是通过currying the function并循环传递参数。有点像:
console.log(...myArray);
尽管如此,我认为仅仅使用myArray.forEach(curriedConsoleLog);
会产生伤害。
答案 2 :(得分:0)
由于你的函数只能接收两个参数,因此可以使用:
function apply(fn, context, args) {
context.fn = fn;
var result = context.fn(args[0],args[1]);
delete context.fn;
return result;
}
function add(a,b) {
return a + b + this.num;
}
console.log(apply(add, {num: 10}, [3, 4]));
答案 3 :(得分:0)
function apply(fn, context, args) {
context.fn = fn;
while (args.length) {
context.fn = context.fn(args.shift());
}
return context.fn;
}
function cubus(a) {
return function (b) {
return function (c) {
return a * b * c / this.num;
}
}
}
function add(a) {
return function (b) {
return a + b + this.num;
}
}
document.write(apply(add, { num: 10 }, [3, 4]));
document.write('<br>');
document.write(apply(cubus, { num: 10 }, [3, 4, 5]));