猿问

调用带参数的构造函数

我有一个无法修改的函数,我需要调用它,但我以前从未见过这样的东西。


var myCategorize = function(z) {

    return function(q) {

      return 1;

    }

 }('window'.indexOf('w') > 0 || window || false);

我已经去掉了 function(q) 部分的一些代码,只是为了简化。


我想我有一个咖喱函数,所以我试过这个:


let category = myCategorize(bookTitles[i])(categories);

但是当我这样做时,我收到以下错误:


Uncaught TypeError: myCategorize(...) is not a function

所以也许这是一个匿名构造函数,所以我尝试这样的事情:


let category = function(){myCategorize(bookTitles[i])(categories)};

console.log(category.apply());

我犯了同样的错误。如何调用此函数并获取返回值 1?


大话西游666
浏览 177回答 2
2回答

紫衣仙女

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);

RISEBY

添加括号时它已经调用了一次函数,所以它的值为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'); // 1console.log(category);let category2 = myCategorize('x')('y'); // throws, equovalent to 1('y');
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答