Я использую фреймворк Polymer, и мне это очень нравится. Но одна вещь, которую я не понимаю, это путаница с this-указателем. Когда функции вызываются, например, из кнопки в вашем пользовательском компоненте, this-pointer указывает на пользовательский компонент. Очень логично. Но когда ваша функция внутри пользовательского компонента вызывается из чего-то внешнего, например, обратного вызова из библиотеки или вызова из другого компонента, this-pointer — это нечто совершенно другое. Почему в этом случае он не указывает на пользовательский компонент, в котором находится функция?
Полимерный указатель
Ответы (1)
Javascript немного странная птица, когда дело доходит до разрешения this
, часто не делая того, что вы бы как. Единственное спасение в том, что это легко объяснить и понять.
Значение функции this
определяется тем, как она вызывается. Предположим, у вас есть значение val
с методом method
. Если метод вызывается как val.method()
, то в этом вызове method
тогда this
равно val
. Если вы вместо этого сделаете var theMethod = val.method; theMethod();
, то для этого вызова this
будет чем-то другим (объект глобального контекста, в браузерах это window
).
Решение, к счастью, простое. Существует метод для функций с именем bind
, который возвращает новую функцию, в которой this
неизменно запечено. , Итак, var theMethod = val.method.bind(val); theMethod()
имеет this
связанное с val
.
В будущем во многих случаях мы сможем использовать обозначение стрелок ES6, чтобы запечь это поведение. in во время определения функции, но сейчас, при передаче метода (например, для регистрации обработчика событий) обязательно запеките this
в явном виде с bind
.