Как получить значение анонимной функции?

#javascript

#язык JavaScript

Вопрос:

В моем index.js файл, который я вызываю функцию iterateWagons

src/index.js

 import { locomotive } from './data/train.js' import { iterateWagons, filterOldBreaks } from './utils/train.js'  iterateWagons(  locomotive,  wagon =gt; console.log(`🚂 ${wagon.name} is a locomotive`),  wagon =gt; wagon.isLocomotive, )  

Моя цель-реализовать эту функцию…

«Пройдитесь» по всему поезду, когда задана отправная точка (локомотив). Существует три параметра:

  • начало: отправная точка поезда
  • actionFn: функция, которая будет вызываться для каждого вагона в поезде
  • filterFn: функция, которая будет вызываться для каждого вагона в поезде. Если он вернет значение false, вагон будет пропущен.

src/utils/train.js

 export const iterateWagons = (start, actionFn, filterFn) =gt; { ... }  

Когда я распечатываю filterFn с console.log(filterFn) помощью консоли [Function (anonymous)] , я не могу понять, правда это или ложь.

Как я могу получить к этому доступ?


Это мой проект реализации:

src/utils/train.js

 export const iterateWagons = (start, actionFn, filterFn) =gt; {  while (start.next) {  if (filterFn(start)) {  actionFn(start)  }  start = start.next  } }  

с этим я получаю ошибку TypeError: filterFn is not a function

Я также пробовал использовать только

 if (filterFn)  

но здесь я не попал true или false не так, как ожидал.


Дополнительная Информация:

  • console.log(filterFn) -gt; [Function (anonymous)]
  • console.log(filterFn(start)) -gt; TypeError: filterFn is not a function

Структура проекта:

Структура проекта


Данные:

src/data/train.js

 [...]  const wagon1 = {  name: 'W-10582',  emoji: '🚋',  lastBreakRevision: '2021-02-15',  next: wagon2, } export const locomotive = {  name: 'L-283',  emoji: '🚂',  isLocomotive: true,  next: wagon1, }   

Решение:

У меня есть рабочее решение:

 const defaultFilterFn = () =gt; true const defaultActionFn = wagon =gt; console.log(`${wagon.emoji} ${wagon.name}`)  export const iterateWagons = (start, actionFn, filterFn) =gt; {   filterFn = filterFn || defaultFilterFn  actionFn = actionFn || defaultActionFn   while (start) {  if (filterFn(start)) {  actionFn(start)  }   start = start.next    } }  

Комментарии:

1. Вам нужно вызвать функцию, console.log(filterFn(wagon))

2. Я бы посоветовал вам показать весь код в виде фрагмента, это поможет другим отладить код.. Внутри вашего вопроса есть a lt;gt; , это позволяет вам прикрепить свой код и сделать его работоспособным внутри SO.

3. Пожалуйста, проверьте корпус на всех ваших именах переменных. Это подозрительно похоже на проблему с опечаткой.

4. Я предполагаю, что вы делаете это внутри тела вашего определения iterateWagons. Ты пробовал console.log(filterFn()) ?

5. Все, что нам нужно, — это ваш iterateWagons и как вы это называете … Нам не нужны все ваши модули js.

Ответ №1:

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

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

 function t(fooFn) { console.log('Foo is '   fooFn()) }  t(() =gt; 'value of foo') 

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

Ответ №2:

Небольшой тест:

 func = function(start, fn){fn(start)}; func(2, a=gt;console.log(`Test ${a}`));  

Это будет напечатано Test 2 на консоли. Таким образом, ваша проблема может заключаться в реализации, которую вы не показали.

Редактировать:

 waggon = {"isLocomotive": true};  func = function(start, fn){fn(start)};  func(waggon, a=gt;console.log(`${a.isLocomotive}`));  

Это отпечатки true пальцев .

Комментарии:

1. Я добавил свою реализацию в конце вопроса

2. Ваш код выглядит хорошо. Но почему ты хочешь позвонить console.log(filterFn) ? Таким образом, вы получите информацию об объекте filterFn . И когда вы позвоните console.log(filterFn(start)) , вы получите возвращаемое значение этого вызова, которое не определено.