Js 柯里化条件
Js currying with condition
我很长时间以来一直在努力理解这段代码,我知道柯里化函数,但对这段代码感到困惑,请解释背后的理论
var currying = function(fn) {
var args = [];
return function() {
if (!!arguments.length){
[].push.apply(args, arguments);
return arguments.callee;
} else {
// what is 'this' in apply method
return fn.apply(this, args);
}
}
}
// currying var or args
// please explain the code below
var find = function(arr, el){
return arr.indexOf(el) !== -1;
}
var newFind = currying(find)([1,2,3]);
console.log( newFind(1)());
console.log( newFind(2)());
为了方便解释,我们把最后一段代码转换一下:
// newFind = currying(find)([1,2,3]);
// console.log(newFind(1)());
// above is the same with below
console.log( currying(find)([1,2,3])(1)());
currying
接受一个函数 find
所以 currying
中的 fn
是 find
。
因为它 return 是一个函数,所以可以像代码中显示的那样调用它 currying(find)([1,2,3])
我们来看这部分,currying(find)([1,2,3])
。
它执行 currying
的 returned 方法。它可以使用关键字 arguments
访问参数,即代码中 [1,2,3]
的数组。
参数是数组,表示它有长度值。然后参数被推入 args
数组和 return 它的被调用者,这意味着 currying
.
的内部方法
因为它是 return 的方法,所以可以用 currying(find)([1,2,3])(1)()
的下一个参数 (1)
再次调用它。
同样,它执行 currying
的内部方法,参数为:1
。那么它就不是一个数组,所以它调用 fn.apply(this, args)
。
this
代码中的关键字在这种情况下没有任何意义。您可以将 this
替换为 null
或者您可以使用 fn(...args)
代替。该代码用于将参数数组转换为每个参数。例如[[1,2,3], 1]
转换为 [1,2,3], 1
然后,最后它执行带有参数 [1,2,3]
、1
的 find
函数。你应该记住所有这些东西都来自 currying
的 returned 方法,所以你必须将它作为函数调用。在末尾附加 ()
以执行函数。
我很长时间以来一直在努力理解这段代码,我知道柯里化函数,但对这段代码感到困惑,请解释背后的理论
var currying = function(fn) {
var args = [];
return function() {
if (!!arguments.length){
[].push.apply(args, arguments);
return arguments.callee;
} else {
// what is 'this' in apply method
return fn.apply(this, args);
}
}
}
// currying var or args
// please explain the code below
var find = function(arr, el){
return arr.indexOf(el) !== -1;
}
var newFind = currying(find)([1,2,3]);
console.log( newFind(1)());
console.log( newFind(2)());
为了方便解释,我们把最后一段代码转换一下:
// newFind = currying(find)([1,2,3]);
// console.log(newFind(1)());
// above is the same with below
console.log( currying(find)([1,2,3])(1)());
currying
接受一个函数 find
所以 currying
中的 fn
是 find
。
因为它 return 是一个函数,所以可以像代码中显示的那样调用它 currying(find)([1,2,3])
我们来看这部分,currying(find)([1,2,3])
。
它执行 currying
的 returned 方法。它可以使用关键字 arguments
访问参数,即代码中 [1,2,3]
的数组。
参数是数组,表示它有长度值。然后参数被推入 args
数组和 return 它的被调用者,这意味着 currying
.
因为它是 return 的方法,所以可以用 currying(find)([1,2,3])(1)()
的下一个参数 (1)
再次调用它。
同样,它执行 currying
的内部方法,参数为:1
。那么它就不是一个数组,所以它调用 fn.apply(this, args)
。
this
代码中的关键字在这种情况下没有任何意义。您可以将 this
替换为 null
或者您可以使用 fn(...args)
代替。该代码用于将参数数组转换为每个参数。例如[[1,2,3], 1]
转换为 [1,2,3], 1
然后,最后它执行带有参数 [1,2,3]
、1
的 find
函数。你应该记住所有这些东西都来自 currying
的 returned 方法,所以你必须将它作为函数调用。在末尾附加 ()
以执行函数。