Как присвоить результат функции стрелки (=>) переменной в JavaScript - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь присвоить переменной функцию стрелки результат следующим образом:

function mutation(arr) {

  let allThere = true 

  while (allThere) {
    for (let c of arr[1]) {

      //the function in question below this line
      allThere = (c) => { 
        if (!arr[0].includes(c)) {
          return false
        }
      }
    }
  }

  return allThere;

Итак, я надеюсь получить логическое значение , возвращаемое из функции стрелки и сохраненное в allThere, но на самом деле происходит то, что вся функция хранится в этой переменной, а не в результате функции. Я мог бы упустить что-то простое здесь

(В качестве дополнительного вопроса мне интересно, есть ли способ заставить функцию стрелки возвращать значение непосредственно внешней функции mutations(arr)).

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Итак, я надеюсь получить логическое значение, возвращаемое из функции стрелки и сохраненное в allThere

Чтобы сделать это, вы должны вызвать функцию. Определение и вызов функции в одно и то же время называется IIFE («встроенное вызывание» [или «немедленное вызывание»] «выражение функции»):

    allThere = ((c) => { 
//             ^
      if (!arr[0].includes(c)) {
        return false
      }
    })()
//   ^^^

но учтите, что вам нужно обработать оба случая (true и false):

allThere = ((c) => { 
  return !arr[0].includes(c);
})()

... которая может быть записана как краткая функция стрелки:

allThere = ((c) => !arr[0].includes(c))();

... но, разумеется, совсем не обязательно быть функцией:

allThere = !arr[0].includes(c);

(В качестве дополнительного вопроса мне интересно, есть ли способ заставить функцию стрелки возвращать значение непосредственно мутациям внешней функции (arr)).

Да, поскольку функция закрывает переменных в контексте, в котором она появляется, поэтому вы могли бы сделать:

((c) => { 
  if (!arr[0].includes(c)) {
    allThere = false
  }
})()

... но опять же, там нет никаких причин для функции.

0 голосов
/ 05 января 2019

Вы просто назначаете функцию, не выполняющую функцию. Который выглядит даже бесполезным в этом смысле. Используйте every:

console.log(arr[1].every(c => arr[0].includes(c)));

0 голосов
/ 05 января 2019

Вы должны использовать IIFE (немедленное выражение вызванной функции) в этом случае:

function mutation(arr) {

  let allThere = true 

  while (allThere) {
    for (let c of arr[1]) {

      //the function in question below this line
      allThere = ((c) => { 
        if (!arr[0].includes(c)) {
          return false
        }
      })();//Immediately invoke the expression here to get the return value
    }
  }

  return allThere;
}
console.log(mutation([['1'], ['2']]));

Дополнительный вопрос, который вы можете вернуть после вызова IIFE:

function mutation(arr) {

  let allThere = true 

  while (allThere) {
    for (let c of arr[1]) {

      //the function in question below this line
     return ((c) => { 
        if (!arr[0].includes(c)) {
          return false
        }
      })();//Immediately invoke the expression here to get the return value
    }
  }    
}
 console.log(mutation([['1'], ['2']]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...