Как передать значение (а не ссылку) переменной JS в функцию?[дубликат]

StackOverflow https://stackoverflow.com/questions/2568966

Вопрос

Вот упрощенная версия того, что я пытаюсь запустить:

родовое слово

, но я обнаружил, что каждый слушатель использует значение 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.

родовое слово

Но я не тестировал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top