Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Правильная передача this (https://javascript.ru/forum/misc/27748-pravilnaya-peredacha.html)

danik.js 23.04.2012 19:01

Правильная передача this
 
Есть код:
var self  = this;
        this.editor.commands.addCommand({
            name: "gotoline",
            bindKey: {win: "Ctrl-L", mac: "Command-Option-L"},
            //exec: function (){ self.showGotoLineWindow.call(self) },
            exec: this.showGotoLineWindow,
            readOnly: true
        });


Тоесть для exec нужно указать метод showGotoLineWindow моего объекта, и чтобы он вызывался с this, указывающем на мой объект.

cmygeHm 23.04.2012 19:13

var self  = this;
        this.editor.commands.addCommand({
            name: "gotoline",
            bindKey: {win: "Ctrl-L", mac: "Command-Option-L"},
            //exec: function (){ self.showGotoLineWindow.call(self) },
            exec: function(){
                  self.showGotoLineWindow
            },
            readOnly: true
        });

А внутри своего this.editor.commands.addCommand.exec вот так:
this.editor.commands.addCommand.exec = function(func)
{
      func();
}

т.е. в exec передаешь указатель на анонимную функцию
function(){
                  self.showGotoLineWindow
            },

и там же ее вызываешь. Все вместе это называется callback-функция.

danik.js 24.04.2012 06:03

Я не могу изменить exec, он реализован в сторонней "библиотеке". Кроме того, ваш вариант выглядит неработоспособным какимто..

nerv_ 24.04.2012 10:45

так, что ли?
var self  = this;
self.editor.commands.addCommand({
	name: "gotoline",
	bindKey: {
		win: "Ctrl-L",
		mac: "Command-Option-L"
	},
	exec: {
		showGotoLineWindow: function() {
			self.showGotoLineWindow.call( self );
		}
	},
	readOnly: true
});

cmygeHm 24.04.2012 10:57

А как называется сторонняя библиотека?

Gvozd 24.04.2012 11:22

вот так должно быть правильно(Вы забыли про аргументы и результат функции
exec: function () {
    return self.showGotoLineWindow.apply(self, arguments);
}

danik.js 24.04.2012 17:20

Цитата:

Сообщение от cmygeHm (Сообщение 170901)
А как называется сторонняя библиотека?

Ну, не то чтобы библиотека.. В общем редактор кода ACE (ajax.org Cloud9 Editor) - типа CodeMirror, только круче.

Тоесть мой исходный быдлокодерский закомментированный вариант и есть единственно верный? Мне оно какимто кривым казалось :)

Тоесть закомментированная строчка делает то что мне нужно, но я думал ее можно упростить както...

Gvozd 24.04.2012 22:00

Maxmaxmахimus,
А как же IE?)

danik.js 24.04.2012 23:15

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 171000)
слупки
var self  = this;
        this.editor.commands.addCommand({
            name: "gotoline",
            bindKey: {win: "Ctrl-L", mac: "Command-Option-L"},
            exec: self.showGotoLineWindow.bind(self),
            readOnly: true
        });

Спасибо, кажется то что нужно :)
Правда еще не проверял.

ACE при себе имеет целый комплект костылей - ща поглядел - в коде фигурирует такой код:
Код:

if (!Function.prototype.bind) {
    Function.prototype.bind = function bind(that) {
    ...
    }
}
}

Тоесть всякие ие будут хоть и прихрамывая, но работать

OFFTOP че такое "слупки" ?


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