Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
在11个月前关闭。
Improve this question
我一直在寻找解决代码战难题的解决方案,但我不明白为什么会起作用。 minus()如何工作?
由于
这是测试版本:
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
在11个月前关闭。
Improve this question
我一直在寻找解决代码战难题的解决方案,但我不明白为什么会起作用。 minus()如何工作?
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 5
最佳答案
这有点复杂。 :-)console.log(eight(minus(three())));
是由内而外运行的,因此让我们按照以下步骤进行操作:
three()
-调用makeNum(3, undefined)
并返回它返回的内容。 makeNum(3, undefined)
返回3
,这就是返回值。 minus(3)
-调用minus
,将3
作为right
传递。 minus
返回一个关闭right
的新函数。 eight(...)
-调用makeNum(8, fnFromMinus)
,其中fnFromMinus
是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 5
.as-console-wrapper {
max-height: 100% !important;£
}
08-07 13:09