#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))
, вы получите возвращаемое значение этого вызова, которое не определено.