Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите новичку с колбэками (https://javascript.ru/forum/misc/46985-pomogite-novichku-s-kolbehkami.html)

MishaUA 03.05.2014 14:56

Помогите новичку с колбэками
 
Всем привет!
Несколько лет программирую на С/С++. Сейчас пишу программу на Qt с использованием QtScript, чтобы программу можно было расширять с помощью ECMAScript (почти тот же JavaScript).
Проблемы у меня возникли на стадии изучения ООП на JavaScript. Допустим, есть код:
var ob = {
	function func(callb) {
		callb();
	}
}

function MainObject() {
	var	testVar = false;
	
	ob.func(function(){
		this.testVar = true;
	});
}

var mobject = new MainObject();

Нужно, чтобы в конструкторе MainObject вызвалась функция func объекта ob и выполнила переданную функцию, сама функция должна установить переменную testVar функции MainObject.
Если бы не было последней строки, можно было бы callb() заменить на callb.call(MainObject) (наверно). Но как задать объект this в данном случае?
Спасибо!

danik.js 03.05.2014 15:17

Цитата:

Сообщение от MishaUA
Но как задать объект this в данном случае?

Контекст надо задавать при вызове функции. А вызов у тебя происходит на третьей строчке. Вот там и должен устанавливаться контекст. Например так:

var ob = {
    function func(callb, context) {
        callb.call(context);
    }
}
 
function MainObject() {
    var testVar = false;
     
    ob.func(function(){
        this.testVar = true;
    }, this);
}


Хотя есть ES5 функция bind(), с помощью которой можно привязать контекст к самой функции:

ob.func(function(){
        this.testVar = true;
    }.bind(this));


Ну и самый простой вариант, не требующий указания контекста:
var mainObject = this;
    ob.func(function(){
        mainObject.testVar = true;
    });

danik.js 03.05.2014 15:19

Что-то сразу не заметил. Ты видимо хотел написать так?
function MainObject() {
    this.testVar = false;
     
    ...
}

MishaUA 03.05.2014 18:02

Огромное спасибо!!!!


Часовой пояс GMT +3, время: 03:39.