一、介绍
六大派围攻光明顶,为解除明教危机,张无忌临危受命,在小昭的帮助下进入明教圣地拿到乾坤大挪移心法。在这关键时刻,心法因没有妥善保存长久暴露在空气中,部分字体已不可见,下面需要由你来设计心法帮助张无忌习得神功,战胜六大门派。
二、目标
找到 main.js 文件中的“乾坤大挪移心法” mentalMethod 函数,完成函数中的 TODO 部分。
- mentalMethod 需要返回一个函数,可以一直进行调用,但是最后一次调用不传参。
- 函数通过以下方式执行,返回结果均为 ‘战胜峨眉,武当,少林’。
mentalMethod('峨眉')('武当')('少林')();
mentalMethod('峨眉','武当')('少林')();
mentalMethod('峨眉','武当','少林')();
注意逗号为英文逗号。
完成后,在命令行输入 node main.js 效果如下:
三、代码
js
function mentalMethod(...args) {
// TODO 待补充代码
}
console.log(mentalMethod('峨眉')('武当')('少林')());
console.log(mentalMethod('峨眉', '武当')('少林')());
console.log(mentalMethod('峨眉', '武当', '少林')());
// 以下代码为测试使用,请勿删除
module.exports = {
mentalMethod
}
一开始想这道题思考了很多 闭包 立即执行函数 等等 要注意的是返回函数而不立即执行
四、答案
法一: 我觉得这种解法的缺点就是要使用外部数组
//内部函数能够访问外部变量
let arr = []
function mentalMethod(...args){
//创建一个数组的深拷贝,让你可以安全地对该数组进行修改而不会影响到原始数组。
const newArr = JSON.parse(JSON.stringify([...args]))
//将数组中的元素赋值给外部数组
for(let i of newArr){
arr.push(i)
}
//如果数组长度大于1,说明还在调用该函数就返回函数本身
if(newArr!=0){
return mentalMethod
}else{
//否则返回字符串
let str = '战胜' + arr.join(',')
//由于它是连续调用的,所以每次调用完后都要清空数组
arr = []
return str
}
}
console.log(mentalMethod('峨眉')('武当')('少林')());
console.log(mentalMethod('峨眉', '武当')('少林')());
console.log(mentalMethod('峨眉', '武当', '少林')());
法二: 这种解法就是为了得到正确答案不择手段的做法
function mentalMethod(...args) {
// TODO 待补充代码
if(args.length){
return mentalMethod
}else{
return '战胜峨眉,武当,少林'
}
}
法三:利用闭包解决外部数组
扫描二维码关注公众号,回复:
14584078 查看本文章
function mentalMethod(...args) {
// TODO 待补充代码
let str = ''
str += args.join(',')
//闭包做法
let newFn = function (...args) {
//如果arsg.length>0,说明还有参数,继续递归调用
if (args.length > 0) {
str += ',' + args.join(',')
return newFn
} else {
//如果没东西了,就返回结果
return '战胜' + str
}
}
//上面这个函数走出来说明函数调用结束了 且str已经赋值完成
return newFn
}
console.log(mentalMethod('峨眉')('武当')('少林')());
console.log(mentalMethod('峨眉', '武当')('少林')());
console.log(mentalMethod('峨眉', '武当', '少林')());