Как передать значение (а не ссылку) переменной JS в функцию?[дубликат]
-
24-09-2019 - |
Вопрос
На этот вопрос уже есть ответ:
Вот упрощенная версия того, что я пытаюсь запустить:
родовое слово, но я обнаружил, что каждый слушатель использует значение results.length (значение при завершении цикла for).Как я могу добавить слушателей, чтобы каждый использовал значение i в момент его добавления, а не ссылку на i?
Решение
В современных браузерах вы можете использовать ключевые слова let
или const
для создания переменной с блочной областью видимости:
В старых версиях браузеров вам необходимо создать отдельную область, которая сохраняет переменную в ее текущем состоянии, передавая ее как параметр функции:
родовое словоСоздавая анонимную функцию и вызывая ее с переменной в качестве первого аргумента, вы передаете функции по значению и создаете закрытие.
Другие советы
Помимо замыканий, вы можете использовать function.bind
:
передает значение i
в качестве аргумента функции при вызове.(null
используется для привязки кода this
, который в данном случае вам не нужен.)
function.bind
был введен платформой Prototype и стандартизирован в ECMAScript Fifth Edition.Пока все браузеры не поддерживают его изначально, вы можете добавить поддержку собственного кода кода кода, используя закрытие:
закрытия:
родовое словоИЗМЕНИТЬ, 2013 г .: Сейчас их обычно называют IIFE
Вы завершаете закрытие. Вот статья о замыканиях и о том, как с ними работать.Посмотрите Пример 5 на странице;это тот сценарий, с которым вы имеете дело.
РЕДАКТИРОВАТЬ: четыре года спустя эта ссылка мертва.Корень проблемы выше в том, что цикл for
формирует замыкания (особенно на marker = results[i]
).Когда marker
передается в addEventListener
, вы видите побочный эффект закрытия: общая «среда» обновляется с каждой итерацией цикла, прежде чем она будет окончательно «сохранена» посредством замыкания после последней итерации. MDN очень хорошо это объясняет.
Я думаю, мы можем определить временную переменную для хранения значения i.
родовое словоНо я не тестировал.