Вызов функции конструктора с параметрами - PullRequest
0 голосов
/ 11 октября 2019

У меня есть функция, которую я не могу изменить, и мне нужно ее вызвать, но я не видел ничего подобного раньше.

var myCategorize = function(z) {
    return function(q) {
      return 1;
    }
 }('window'.indexOf('w') > 0 || window || false);

Я удалил часть кода в части функции (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?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

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);
1 голос
/ 11 октября 2019

Она уже вызывает функцию один раз при добавлении скобок, поэтому значение 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...