Задать вопрос

JavaScipt — как получить доступ к внешнему this?

Есть такой вот код:
var TreeCreator = function(width, height, treeData) {
    this.state = {
            selectedNode: false,
           nodeId: 0
         };

TreeCreator.prototype.renderTree = function() {
    var node = this.svg.selectAll(".node")
            .data(nodes, function (d) {
                d.px = d.x;
                d.py = d.y;
                return d.id || ++this.state.nodeId;
            });
    };


Понятное дело, что кода намного больше. Я просто взял один из проблемных кусков, чтобы было понятно.
Так вот, в строчке return d.id || ++this.state.nodeId, this это не TreeCreator, а внутренний объект.
Как мне получить доступ к this, который как бы на уровень выше?

Таких вот, случаев достаточно много и делать каждый раз что-то типа thisTree = this перед вызовом внутренних функций неудобно...
  • Вопрос задан
  • 2541 просмотр
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
.data(nodes, (function (d) {...}).bind(this))
хотя те же яйца, только в профиль. В ES6 будут стрелочные функции с сохранением контекста, аналогично кофе, но вот только не скоро это будет.
Ответ написан
mmmaaak
@mmmaaak
По другому получить нужный this, увы, не получится. Сохраняйте заранее. Ну или если хочется забыть про такие костыли, я например, пишу на CoffeeScript. В нем есть синтаксический сахар, специально для этого случая, и не надо писать кучу лишнего
Ответ написан
@llirikkkk
Может стоит посмотреть в сторону function.apply({объект который будет this}, [массив аргументов])?
javascript.ru/Function/apply
выделить
function (d) {
                d.px = d.x;
                d.py = d.y;
                return d.id || ++this.state.nodeId;
            }

в отельную функцию и вызывать через apply
Ответ написан
Комментировать
Zoxon
@Zoxon
Веб-разработчик
Так
var that = this;
…
return d.id || ++that.state.nodeId;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы