Как передать «это» в окно setInterval

Предположим, у меня есть функция:

function a() {
    this.b = 1;
    this.set = setInterval(function() {console.log(this.b);}, 200);
}

Поэтому, когда вызывается a.set (), вызывается анонимная функция. Но это не сработает в то время, когда функция запускается, указывает на объект окна. Также не рекомендуется использовать a.b, так как может быть несколько экземпляров a.

Какое хорошее решение этой проблемы?

 Deeptechtons08 июн. 2012 г., 08:32
почему ты не используешьapply илиcall Developer.mozilla.org / о / JavaScript / Справочник / Global_Objects / ...
 nnnnnn08 июн. 2012 г., 08:35
@ Deeptechtons - я не думаю, чтоapply илиcall есть ли какая-то польза для этой проблемы, но, возможно, вы могли бы объяснить, что вы имели в виду в ответе?
 Deeptechtons08 июн. 2012 г., 08:41
@ nnnnnn Вопрос определенно является кандидатом на вопрос «Как изменить контекст внутри функции». Что решается с помощью аппи или звонка. Но может быть излишним для этого случая.
 nnnnnn08 июн. 2012 г., 23:05
@ Deeptechtons - Я говорю, что.call а также.apply здесь не сработает - вы не можете просто добавить их в функцию, переданнуюsetInterval потому что к тому времениthis это уже не то..bind будет работать, хотя, чтобы установитьthis в функции, передаваемойsetInterval.
 NSF08 июн. 2012 г., 08:44
@ Deeptechtons Хмм, хорошее предложение, но эта проблема явно не должна быть на этом уровне.

Ответы на вопрос(1)

Решение Вопроса

Сохранить ссылку наthis:

function a() {
    var self = this;
    self.b = 1;
    self.set = setInterval(function() {console.log(self.b);}, 200);
}

Анонимная функция, которую вы передаетеsetInterval имеет доступ к любым переменным в своей содержащей области, т. е. к любым локальным переменнымfunction a(). Волшебство замыканий JS поддерживает эти переменные даже послеa() завершена, и каждый вызовa() получает свое собственное закрытие.

 Shane14 дек. 2017 г., 00:03
Не знаю почему, но внутри функции интервала self переключается обратно на объект окна?
 nnnnnn08 июн. 2012 г., 23:17
Как я уже упоминал в своем ответе, внутренняя функция имеет доступ к переменным в рамках своей функции даже после того, как содержащая функция закончена. В этом случаеsetInterval продолжает хранить ссылку на внутреннюю функцию, поэтому она может продолжать вызывать ее даже послеa() закончил; пока интервал не будет очищен, эта ссылка останется в живых, а переменные останутся в живых. Обратите внимание, чтоa() воля Определенно Завершить до того, как интервал сработает (независимо от того, насколько короткий интервал), потому что JS работает в одном потоке. Google "JavaScript закрытия" для получения дополнительной информации.
 NSF10 июн. 2012 г., 10:29
Имею смысл. Благодарность
 HoldOffHunger18 авг. 2017 г., 17:04
Это работает, когда "this" var тоже является классом JS (как в ReactJS), а не просто элементом dom.
 NSF08 июн. 2012 г., 08:42
Да, я видел такие примеры, но это именно то, что меня смущает. Предположим, что «a» завершается до того, как сработает событие в 200 мс, переменная self, кажется, должна быть уничтожена в это время Если нет, то когда он будет уничтожен? после очистки интервала?

Ваш ответ на вопрос