gpt4 book ai didi

javascript - 使用我的函数本身并按 'correct' 顺序返回

转载 作者:行者123 更新时间:2023-11-28 19:46:17 25 4
gpt4 key购买 nike

我有这个功能

var foo = function(){
var args = Array.prototype.slice.call(arguments, 0);

for (var i = 0; i < args.length; i++) {
console.log(args[i]);
}
};

这样使用

foo(1, 2, 3, 4, 5, 6, 7, 8);

结果

enter image description here

但我希望它的用法像这样工作,并得到相同的结果

foo(1, 2, foo(3, 4, 5), 6, 7, 8);

然而结果是

enter image description here

提前致谢

马赫

最佳答案

But I want it's usage to work like this, and get the same outcome

foo(1, 2, foo(3, 4, 5), 6, 7, 8);

你不能。该行相当于:

var tmp = foo(3, 4, 5);
foo(1, 2, tmp, 6, 7, 8);

也就是说,首先 foo(3, 4, 5) 位运行,然后 foo(1, 2, mumble, 6, 7 , 8) 位运行。

您可以玩一些游戏来推迟执行,但它们往往非常具体于您实际正在做的事情(我认为这不仅仅是按顺序输出数字)。

例如,您可以在这里玩的一个游戏是让 foo 检测其参数是否是函数,如果是,则调用它们;那么你可以使用 Function#bind (或类似)来创建函数,在调用时,该函数将具有您想要的参数。看起来像这样:

var foo = function(){
var args = Array.prototype.slice.call(arguments, 0);
var arg;

for (var i = 0; i < args.length; i++) {
arg = args[i];
if (typeof arg === "function") {
arg();
} else {
console.log(arg);
}
}
};

然后像这样使用:

foo(1, 2, foo.bind(undefined, 3, 4, 5), 6, 7, 8);

Live Example (source)

这是有效的,因为 Function#bind 不会调用该函数,它会创建一个函数,该函数在被调用时将使用您提供的参数进行调用bind (第一个参数是调用期间 this 的内容;如果您没有任何特定的内容,请使用 undefined)。因此,当我们这样做时,实际上是这样的:

foo(1, 2, foo.bind(undefined, 3, 4, 5), 6, 7, 8);

...我们正在这样做:

var tmpFunction = foo.bind(undefined, 3, 4, 5);
foo(1, 2, tmpFunction, 6, 7, 8);

(Function#bind 是除 IE8 之外的所有现代浏览器中都存在的 ES5 功能(IE8 虽然不是“现代”,但仍在大量使用),但可以使用 es5 正确“填充”它-垫片或类似物。)

(冷知识:创建一个函数并将其一些参数“烘焙”到其中的函数称为 currying 函数,以数学家 Haskell Curry 命名。[是的,这就是编程语言 Haskell 的所在地获取名称。])

关于javascript - 使用我的函数本身并按 'correct' 顺序返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24242407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com