2 回答
TA贡献1839条经验 获得超15个赞
myCategorize不是柯里化函数,它是实现模块模式的 IIFE。最后一行末尾的括号执行顶级function(z):
var myCategorize = function(z) {
return function(q) {
return 1;
}
}('window'.indexOf('w') > 0 || window || false);
//^--------------------------------------------^
并传入 的值z。如果我重新编写它以添加额外的括号和名称位会更清楚:
var myCategorize = (function outer(z) {
//start of outer --^
return function inner(q) {
return 1;
}
})('window'.indexOf('w') > 0 || window || false);
//^-- end of outer
所以你分配给myCategorize的只是inner. 要执行它,只需添加括号和一个参数:
var myCategorize = function(z) {
return function(q) {
return 1;
}
}('window'.indexOf('w') > 0 || window || false);
console.log("myCategorize", myCategorize);
var executionResult = myCategorize("foo");
console.log("executionResult", executionResult);
TA贡献1856条经验 获得超5个赞
添加括号时它已经调用了一次函数,所以它的值为myCategorize:
ƒ (q) {
return 1;
}
然后你调用该函数,let category = myCategorize(bookTitles[i])其值为category:1
是这样,则等效的let category = myCategorize(bookTitles[i])(categories);就是
let category = 1(categories); 抛出那个错误
var myCategorize = function(z) {
return function(q) {
return 1;
}
}('window'.indexOf('w') > 0 || window || false);
let category = myCategorize('x'); // 1
console.log(category);
let category2 = myCategorize('x')('y'); // throws, equovalent to 1('y');
添加回答
举报