【发布时间】:2017-10-12 05:40:20
【问题描述】:
给定:
list = [ "one", "something", "other" ];
foo = function () {
var str = "something",
bar = function (el, idx, array) {return el === str;};
return list.some(bar);
};
for (var i = 0; i < 10; i += 1) {
foo(); // true
}
bar 由 list.some() 调用,带有三个参数。
如果我想在 foo 之外定义 bar ,那么我必须在这样的闭包中给它 str :
list = [ "one", "something", "other" ];
bar = function (str) {
return function baz(el, idx, array) {return el === str;};
}
foo = function () {
var str = "something";
return list.some(bar(str));
};
for (var i = 0; i < 10; i += 1) {
foo(); // true
}
因此,每次调用 bar 时,都会在 bar 中创建/定义一个函数 baz。是否可以通过添加额外的来避免闭包和常量函数的重新创建
bar 的 list.some() 调用的参数如下:
list = [ "one", "something", "other" ];
bar = function (el, idx, array, str) {return el === str;};
// Do something to bar's argument list so it's called with more than three arguments?
baz = function (str) {return bar(el, idx, array, str);}; // ????
foo = function () {
var str = "something";
return list.some(baz(str));
};
for (var i = 0; i < 10; i += 1) {
foo(); // true
}
更新:请注意,可以从循环中调用 foo,如上述示例中所示。 是否可以避免重新创建所有函数,使每个函数只创建一次?
我想传递 bar 四个参数(或前三个参数之后的任意数量的参数,比如这个 bar = function (el, idx, array, str, ...)。目标是只创建任何一个函数一次。请不要使用外部库。
【问题讨论】:
-
顺便说一句,如果在索引零处找到元素,则代码不起作用。
-
我认为这可以通过函数式编程方法来完成,例如柯里化和函数组合。让我做一些修补,我会告诉你我发现了什么。
-
请记住,
bar在第二个示例中只调用一次。它返回的函数被一遍又一遍地调用。它只被创建一次。 -
@DonovanM 是的,每次都会重新创建 bar 中的匿名函数。我将帖子编辑为“baz”。这是我想避免的对 baz 的娱乐。
-
@esnm 查看我使用柯里化的解决方案。我想这就是你要找的东西
标签: javascript function arguments