gpt4 book ai didi

javascript - 从已经定义的函数创建一个闭包?

转载 作者:行者123 更新时间:2023-11-29 10:19:13 25 4
gpt4 key购买 nike

我想扩展 Array.sort() 以接受另一个参数。 This question有一个使用闭包的解决方案,所以这段代码有效:

var create_comparator = function(c) {
return function(a,b) { console.log(c); return a-b };
};

arr.sort( create_comparator('test') );

但是,在我的例子中,我已经定义了这样的函数:

var myComp1 = function(a,b) { console.log(c); return a-b };

返回预定义函数不起作用:

var create_comparator = function(sortfn, c) {
// Uncaught ReferenceError: c is not defined
return sortfn;
};

var arr = [7, 4, 9, 2, 1];
arr.sort( create_comparator(myComp1, 'test') );

我认为这是因为在创建原始函数时未定义 c。我试过 return function(a,b) { sortfn(a,b); } 来创建一个新的闭包,但这也不起作用。

是否可以使用此设置为预定义函数提供额外的参数?这个问题还有其他解决方案吗?

最佳答案

您的示例并没有真正说明您对其他参数所做的事情。我仍然会尝试并建议使用部分...例如:

var myComp1 = function (c, a, b) { console.log(c); return a-b };
arr.sort(myComp1.bind(null, "test"));

或者,如果您仍想将其抽象为生成器函数:

var myComp1 = function (c, a, b) { console.log(c); return a-b };

var create_comparator = function(sortfn, c) {
return sortfn.bind(null, c);
};

编辑:另一种方式!可能是您要实现的目标的最佳选择。这很酷的是,您可以附加任意数量的参数到您的排序函数,这使得额外的参数是可选的,因此您也可以将它们用作普通的排序比较器。

var myComp1 = function (a, b, c) { if (c) { console.log(c); } return a-b };

var create_comparator = function() {
var sortfn = arguments[0],
partial = Array.prototype.slice.call(arguments, 1);

return function() {
var args = Array.prototype.slice.call(arguments).concat(partial);
return sortfn.apply(null, args);
}
};

关于javascript - 从已经定义的函数创建一个闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15043496/

25 4 0
文章推荐: javascript - 带有