Полимерный указатель

Я использую фреймворк Polymer, и мне это очень нравится. Но одна вещь, которую я не понимаю, это путаница с this-указателем. Когда функции вызываются, например, из кнопки в вашем пользовательском компоненте, this-pointer указывает на пользовательский компонент. Очень логично. Но когда ваша функция внутри пользовательского компонента вызывается из чего-то внешнего, например, обратного вызова из библиотеки или вызова из другого компонента, this-pointer — это нечто совершенно другое. Почему в этом случае он не указывает на пользовательский компонент, в котором находится функция?


person Peter Fortuin    schedule 08.09.2014    source источник


Ответы (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.

person Peter Burns    schedule 08.09.2014
comment
Это именно тот ответ, который мне был нужен. Это требует некоторого дополнительного кода, но я ожидаю, что указатель this будет именно таким. Большое спасибо за расширенное объяснение. - person Peter Fortuin; 09.09.2014