@Kozgemikin

Не работает this в функциях, что делать?

Есть две функции , одна для отчета расстояния между объектами (для диалога) , вторая для размещения объектов на странице . Я использовал в них this и позже добавил их в объект , чтобы не создавать каждый раз уникальную функцию для каждого объекта . Проблема в том , что код не работает с использованием этого самого this или же различных аргументов в функциях , но работает , если назвать имя объекта в самой функции . Как вы понимаете , создавать отдельную функцию для каждого объекта не ахти . Можете пожалуйста объяснить , в чём проблема . Код такой (функцию передвижения не писал) :

$("body").append("<button id='action1'>-</button>");

var talkf = function() {
    var distance = function(n) {
        var x = img.left - this.left;
        var y = img.top - this.top;
        return Math.sqrt((x * x) + (y * y));
    };
    if (distance < 300) {
        $("#action1").text("Начать диалог");
    } else {
        $("#action1").text("-");
    };
};

var positionf = function() {
    $("#" + this.id).offset({
        left: this.left,
        top: this.top
    });
};

var img = {
    id: "1",
    left: 100,
    top: 200,
    position: setInterval(positionf, 200),
};

var img2 = {
    id: "2",
    left: 500,
    top: 600,
    position: setInterval(positionf, 200),
    talk: talkf
};
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
john36allTa
@john36allTa
alien glow of a dirty mind
Проблема в том, что Вы не знаете, что такое scope..
$("body").append("<button id='action1'>-</button>");

var talkf = function() {
    var distance = function(n) {
        var x = img.left - this.left; 
        var y = img.top - this.top; 
        return Math.sqrt((x * x) + (y * y));
    };
    if (distance() < 300) {
        $("#action1").text("Начать диалог");
    } else {
        $("#action1").text("-");
    };
};

var positionf = function() {
    $("#" + this.id).offset({
        left: this.left,
        top: this.top
    });
};

var img = {
    id: "1",
    left: 100,
    top: 200,
    position: setInterval(() => { positionf.bind(img)() }, 200),
};

var img2 = {
    id: "2",
    left: 500,
    top: 600,
    position: setInterval( () => { positionf.bind(img2)() }, 200),
    talk: talkf.bind(img2)
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы