function asArray(quasiArray, start) {
var result = [];
for (var i = (start || 0); i < quasiArray.length; i++)
result.push(quasiArray[i]);
return result;
}
function partial(func) {
var fixedArgs = asArray(arguments, 1);
return function(){
return func.apply(null, fixedArgs.concat(asArray(arguments)));
};
}
function compose(func1, func2) {
return function() {
return func1(func2.apply(null, arguments));
};
}
var isUndefined = partial(op["==="], undefined);
var isDefined = compose(op["!"], isUndefined);
show(isDefined(Math.PI));
show(isDefined(Math.PIE));
为什么 compose 函数不能简单地返回:
func1(func2);
并给出正确的输出。我认为存储在变量 isUndefined 中的部分函数已经返回 func.apply(null, [fixed, arguments])
var op = {
"+": function(a, b){return a + b;},
"==": function(a, b){return a == b;},
"===": function(a, b){return a === b;},
"!": function(a){return !a;}
/* and so on */
};
最佳答案
partial
和compose
都是 higher-order functions .
isUndefined
将返回一个函数,该函数在被调用时将使用原始参数以及调用时传递的任何新参数来调用最初传递的函数。
要回答您的问题,您需要对从 partial
返回的函数调用 apply
,而这又会调用 apply
函数最初传递给 partial
。
您希望 compose
返回一个函数,该函数在被调用时将返回调用第一个函数的结果并将第二个函数作为参数传递(第二个函数将参数传递给 compose
调用)。如果 compose
返回了 func1(func2)
,那么您会将调用的结果分配给变量 isDefined
。
编辑:
现在我们有了op
,让我们试着分解一下:
var isUndefined = partial(op["==="], undefined);
这相当于
var isUndefined = partial(function(a, b){return a === b;}, undefined);
isUndefined
被分配了一个函数,该函数在调用时将调用作为第一个参数传递给 partial
的函数,将 undefined
传递为该函数调用的第一个参数,后跟传递给函数的参数 isUndefined
即
partial(function(a, b){return a === b;}, undefined /* this will become 'a' when isUndefined is invoked */)(argumentForisUndefined /* this will become 'b' when isUndefined is invoked */);
isDefined
将 isUndefined
与另一个否定 isUndefined
结果的函数组合在一起。
var isDefined = compose(op["!"], isUndefined);
相当于
var isDefined = compose(function(a){return !a;}, isUndefined);
这等同于(为清楚起见重命名变量)
var isDefined = compose(
function(a){return !a;},
partial( /* partial function becomes 'a' passed to first function */
function(b, c) {
return b === c;
},
undefined /* undefined becomes 'b' passed to partial */
)
)(argumentForisDefined /* argumentForisDefined becomes 'c' passed to partial */);
如果我们看看目前为止的内容并用可读性代替,归结为一个函数,该函数接受一个参数并将其与未定义的进行比较,取反结果并返回一个 bool 值
var isDefined = function (b) { return !undefined === b; }
关于javascript - 我正在阅读 Eloquent Javascript,我对这个部分函数示例有点困惑。请帮忙解释一下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100354/