Typ*_*veN 11 javascript codewars
我正在寻找一个关于 codewars 的谜题的解决方案,但我不明白它为什么有效。减号()是如何工作的?
function makeNum(num, func) {
if (func === undefined) {
return num;
} else {
return func(num);
}
}
function three(func) {
return makeNum(3, func);
}
function eight(func) {
return makeNum(8, func);
}
function minus(right) {
return function(left) {
return left - right;
};
}
console.log(eight(minus(three()))); // will log out 5Run Code Online (Sandbox Code Playgroud)
这有点复杂。:-)
console.log(eight(minus(three()))); 是由内而外的,所以让我们来看看:
three()- 调用makeNum(3, undefined)并返回它返回的内容。makeNum(3, undefined)回报3,所以这是返回值。minus(3)- 调用minus,传入3as right。minus返回一个关闭的新函数right。eight(...)- 调用makeNum(8, fnFromMinus)wherefnFromMinus是由 返回的函数minus(3)。makeNum(8, fnFromMinus)确实fnFromMinus,8作为传入left。fnFromMinus返回的结果left - right(记住right是3,fnFromMinus关闭它)。由于8 - 3是5,最终结果是5,它console.log返回。
这是一个检测版本:
let indent = 0;
function show(label) {
console.log(" ".repeat(indent * 4) + label);
}
function fname(fn) {
return fn ? fn.name : "undefined";
}
function makeNum(num, func) {
const descr = `makeNum(${num}, ${fname(func)})`;
show(descr);
++indent;
if (func === undefined) {
--indent;
show(`${descr} returns ${num}`);
return num;
} else {
const rv = func(num);
--indent;
show(`${descr} returns ${num}`);
return rv;
}
}
function three(func) {
const descr = `three(${fname(func)})`;
console.log(descr);
++indent;
const rv = makeNum(3, func);
--indent;
show(descr + ` returns ${rv}`);
return rv;
}
function eight(func) {
const descr = `eight(${fname(func)})`;
console.log(descr);
++indent;
const rv = makeNum(8, func);
--indent;
show(descr + ` returns ${rv}`);
return rv;
}
function minus(right) {
const fn = function fnFromMinus(left) {
show(`${fname(fn)} returns ${left} - ${right} = ${left - right}`);
return left - right;
};
try {
// For browsers that don't do `name` properly
fn.name = "fnFromMinus";
} catch (e) { }
show(`minus(${right}) returns ${fname(fn)}`);
return fn;
}
console.log(eight(minus(three()))); // will log out 5Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
max-height: 100% !important;£
}Run Code Online (Sandbox Code Playgroud)