六大派围攻光明顶,为解除明教危机,张无忌临危受命,在小昭的帮助下进入明教圣地拿到乾坤大挪移心法。在这关键时刻,心法因没有妥善保存长久暴露在空气中,部分字体已不可见,下面需要由你来设计心法帮助张无忌习得神功,战胜六大门派。
题目已经内置了代码,打开实验环境,选中
main.js
文件
找到 main.js
文件中的“乾坤大挪移心法” mentalMethod
函数,完成函数中的 TODO 部分。
mentalMethod
需要返回一个函数,可以一直进行调用,但是最后一次调用不传参。'战胜峨眉,武当,少林'
。mentalMethod('峨眉')('武当')('少林')();
mentalMethod('峨眉','武当')('少林')();
mentalMethod('峨眉','武当','少林')();
注意逗号为英文逗号。
完成后,在命令行输入 node main.js
效果如下:
function mentalMethod(...args) {
// 定义一个内部函数 next,用于接收后续传入的参数
function next(...newArgs) {
// 如果没有传入新的参数,说明是最后一次调用
if (newArgs.length === 0) {
// 将之前收集的所有参数用英文逗号连接成字符串
return `战胜${args.join(',')}`;
} else {
// 如果还有新的参数传入,将新参数添加到已有的参数数组中,并返回 next 函数继续接收参数
return mentalMethod(...args, ...newArgs);
}
}
// 返回 next 函数
return next;
}
console.log(mentalMethod('峨眉')('武当')('少林')());
console.log(mentalMethod('峨眉', '武当')('少林')());
console.log(mentalMethod('峨眉', '武当', '少林')());
// 以下代码为测试使用,请勿删除
module.exports = {
mentalMethod
}
function mentalMethod(...args) {
function next(...newArgs) {
if (newArgs.length === 0) {
return `战胜${args.join(',')}`;
} else {
return mentalMethod(...args, ...newArgs);
}
}
return next;
}
console.log(mentalMethod('峨眉')('武当')('少林')());
console.log(mentalMethod('峨眉', '武当')('少林')());
console.log(mentalMethod('峨眉', '武当', '少林')());
module.exports = {
mentalMethod
}
1. mentalMethod
函数
function mentalMethod(...args) {
// ...
}
...args
来接收传入 mentalMethod
函数的所有参数。剩余参数语法允许我们将多个参数收集到一个数组中。例如,当调用 mentalMethod('峨眉', '武当')
时,args
就会是 ['峨眉', '武当']
。next
函数,这使得我们可以对返回的函数进行进一步的调用,实现链式调用的效果。2. next
函数
function next(...newArgs) {
if (newArgs.length === 0) {
return `战胜${args.join(',')}`;
} else {
return mentalMethod(...args, ...newArgs);
}
}
...newArgs
来接收后续调用时传入的参数。例如,在 mentalMethod('峨眉')('武当')
中,mentalMethod('峨眉')
调用后返回 next
函数,当调用这个返回的 next
函数并传入 '武当'
时,newArgs
就会是 ['武当']
。if (newArgs.length === 0)
用于判断是否是最后一次调用。当最后一次调用时,不会传入任何参数,此时 newArgs
的长度为 0。在这种情况下,使用 args.join(',')
将之前收集的所有参数用英文逗号连接成一个字符串,并在前面加上 '战胜'
,最终返回这个格式化后的字符串。例如,当 args
为 ['峨眉', '武当', '少林']
时,args.join(',')
会得到 '峨眉,武当,少林'
,再加上 '战胜'
就得到 '战胜峨眉,武当,少林'
。newArgs
的长度不为 0,说明还有新的参数传入。此时,使用扩展运算符将 args
和 newArgs
中的元素合并在一起,然后递归调用 mentalMethod
函数,继续接收后续的参数。例如,在 mentalMethod('峨眉')('武当')
中,args
是 ['峨眉']
,newArgs
是 ['武当']
,合并后再次调用 mentalMethod
函数,此时新的 args
就变成了 ['峨眉', '武当']
,然后继续等待下一次调用。三、工作流程 ▶️ 调用示例分析:
1. console.log(mentalMethod('峨眉')('武当')('少林')());
mentalMethod('峨眉')
mentalMethod
函数,传入参数 '峨眉'
,此时 args
数组为 ['峨眉']
。mentalMethod
函数返回 next
函数。('武当')
next
函数,传入参数 '武当'
,此时 newArgs
数组为 ['武当']
。newArgs
数组长度不为 0,递归调用 mentalMethod
函数,将 args
和 newArgs
合并,即 ['峨眉', '武当']
。next
函数。('少林')
next
函数,传入参数 '少林'
,此时 newArgs
数组为 ['少林']
。newArgs
数组长度不为 0,递归调用 mentalMethod
函数,将之前的参数和 newArgs
合并,即 ['峨眉', '武当', '少林']
。next
函数。()
next
函数,没有传入参数,此时 newArgs
数组为空。newArgs
数组长度为 0,将 args
数组中的元素用逗号连接起来,并在前面加上 “战胜”,返回字符串 '战胜峨眉,武当,少林'
。 2. console.log(mentalMethod('峨眉', '武当')('少林')());
mentalMethod('峨眉', '武当')
mentalMethod
函数,传入参数 '峨眉'
和 '武当'
,此时 args
数组为 ['峨眉', '武当']
。mentalMethod
函数返回 next
函数。('少林')
next
函数,传入参数 '少林'
,此时 newArgs
数组为 ['少林']
。newArgs
数组长度不为 0,递归调用 mentalMethod
函数,将 args
和 newArgs
合并,即 ['峨眉', '武当', '少林']
。next
函数。()
next
函数,没有传入参数,此时 newArgs
数组为空。newArgs
数组长度为 0,将 args
数组中的元素用逗号连接起来,并在前面加上 “战胜”,返回字符串 '战胜峨眉,武当,少林'
。 3. console.log(mentalMethod('峨眉', '武当', '少林')());
mentalMethod('峨眉', '武当', '少林')
mentalMethod
函数,传入参数 '峨眉'
、'武当'
和 '少林'
,此时 args
数组为 ['峨眉', '武当', '少林']
。mentalMethod
函数返回 next
函数。()
next
函数,没有传入参数,此时 newArgs
数组为空。newArgs
数组长度为 0,将 args
数组中的元素用逗号连接起来,并在前面加上 “战胜”,返回字符串 '战胜峨眉,武当,少林'
。