Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Простейший пример, но не работает. (https://javascript.ru/forum/misc/35719-prostejjshijj-primer-no-ne-rabotaet.html)

ololosh 20.02.2013 00:47

Простейший пример, но не работает.
 
var obj = {
	name: 'ololosha',
	what: function() {
		alert(this.name);
	}
};

function ololo(fn) {
	fn();
}

ololo(obj.what);


В результате я вижу пустой алерт. Консоль фаербага ни одной ошибка не показывает.
1) почему алерт пустой и код начинает работать, только если сделать так:
ololo(function() {
   obj.what();
})


2) почему консоль фаербага не показывает ни одной ошибки при пустом алерте?

рони 20.02.2013 00:55

ololosh,
потому что увы имя окна пусто - присвойте имя и получите результат )))
var obj = {
	name: 'ololosha',
	what: function() {
		alert(this.name);
	}
};

function ololo(fn) {
	fn();
}
window.name = "bla bla"
ololo(obj.what);

danik.js 20.02.2013 01:24

Или через Function.prototype.bind (ES5)

megaupload 20.02.2013 07:20

рони,
охуеть ты обьяснягшь...

ololosh,
держи бро http://learn.javascript.ru/this

ksa 20.02.2013 08:50

Цитата:

Сообщение от ololosh
почему алерт пустой

Потому как в функцию ololo() было передано
function() {
        alert(this.name);
}

И поскольку (как верно заметил)
Цитата:

Сообщение от рони
имя окна пусто

алерт пустой...

При таком варианте
Цитата:

Сообщение от ololosh
ololo(function() {   obj.what();})

Передаётся функция, в теле которой, вызывается метод объекта. Т.о. алерт показывает тебе значение свойства того объекта...

Цитата:

Сообщение от ololosh
почему консоль фаербага не показывает ни одной ошибки при пустом алерте?

Так ежели их нет - что показывать? :D

megaupload 20.02.2013 08:56

ОБЪЯСНЕНИЕ НОРМАЛЬНОЕ:

в функции, this не строго привязан к обьекту, а зависит от формы вызова.

он ссылается на то что слева через точку от вызываемой функции, если же там ни чего нет то он равен window

передав метод обьекта в ololo ты как бы оторвал его от обьекта, и this больше не ссылается на обьект.

ksa 20.02.2013 08:59

Цитата:

Сообщение от megaupload
ОБЪЯСНЕНИЕ НОРМАЛЬНОЕ:

Не умер Данила, а яром придавило... :D

danik.js 20.02.2013 09:40

Цитата:

Сообщение от megaupload
то он равен window

Точнее он равен глобальному объекту. В обычных случаях это window, в Node.js это вроде бы global, а в вебворкерах - не помню :)

ololosh 25.02.2013 15:23

тогда почему такой варинат тоже не работает?

var obj = {
		id: 123,
		what: function() {
			alert(this.id);
		}.bind(this)
	};
	
	func = obj.what;
	func();


func() выводит алерт с undefined
Я ж делал все как тут нааписано:
http://learn.javascript.ru/bind

ksa 25.02.2013 15:32

Цитата:

Сообщение от ololosh
Я ж делал все как тут нааписано:
http://learn.javascript.ru/bind

Что именно? :) Приведи "тот" пример.

ololosh 25.02.2013 15:38

"тот" пример:
function User() {
  this.id = 1;

  this.sayHi = function() { 
    alert(this.id); 

  }.bind(this);

}

var user = new User();

setTimeout(user.sayHi, 1000); // выведет "1"


Мой код выше с obj - аналогичен, только у меня сразу объект, без функции-конструтора.

ksa 25.02.2013 15:39

Цитата:

Сообщение от ololosh
Мой код выше с obj - аналогичен

Да ты чё!? :haha:

ololosh 25.02.2013 15:47

Ок, конструктива с твоей стороны не будет, я понял. Просто не отписывайся тут и всё.

ksa 25.02.2013 15:48

setTimeout(user.sayHi, 1000);

Тут user - объект, а sayHi - его метод.

А что у тебя?
Цитата:

Сообщение от ololosh
func = obj.what;

Что есть func у тебя?

ksa 25.02.2013 15:49

Цитата:

Сообщение от ololosh
конструктива с твоей стороны не будет, я понял

Ты спец - тебе видней про конструктив... :D

ololosh 25.02.2013 15:58

Мой вопрос и сравнение моего кода с примером по ссылкы - вполне адекватны. И там, и там копирование функции с потерей контекста из-за this

Цитата:

Тут user - объект, а sayHi - его метод.
А что у тебя?
А у меня obj - объект, а what - его метод. Как бы не заметить это трудно.

Цитата:

Что есть func у тебя?
Копирование функции. В примиере она копируется в параметр setTimeout. У меня просто копирование.

Цитата:

Ты спец - тебе видней про конструктив...
Ты этим сейчас только подтверждаешь мои слова.
Просто не отписывай тут и всё. Смысл этой просьбы-то ты должен понимать, она не сложная.

ksa 25.02.2013 16:04

Цитата:

Сообщение от ololosh
А у меня obj - объект, а what - его метод. Как бы не заметить это трудно.

Только тебе трудно понять что это таки разные места... :D

Цитата:

Сообщение от ololosh
В примиере она копируется в параметр setTimeout.

"Она" там не копируется, а setTimeout будет выполняеть метод объекта. :D

Цитата:

Сообщение от ololosh
Просто не отписывай тут и всё.

Твоя просьба услышана... :D

ololosh 25.02.2013 16:12

Пиздец, задал вопрос на форуме, вместо того что бы ответить где я ошибаюсь, чел с колобком на аватаре начал писать "да ты че, ухаха", ставя многоточия смайлы после каждой строчки, назвал "тупым доцентом" (это же интернет, зачем тут следить за своим языком, ведь тут можно не бояться получить по ***** за свои слова), на сам мой вопрос отвечать даже не думал. На просьбу перестать флудить чел продолжает это делать и пишет при этом "твоя просьба успешна.....)))))" И даже после этой фразы продолжает писать ахинею

И это все из-за того, что я спросил, почему в моем примере не работет прием с методом bind.
Ахренеть, ну у вас и имбицилы тут водятся.

ksa 25.02.2013 16:17

Эээ, а мне теперь можно написать? :D

danik.js 25.02.2013 18:16

Цитата:

Сообщение от ololosh
var obj = {
        id: 123,
        what: function() {
            alert(this.id);
        }.bind(this)
    };
     
    func = obj.what;
    func();

К чему ты привязал метод what через bind(this) ? Правильно, к глобальному объекту (window). А в примере к конструктором к чему идет привязка? Правильно к объекту, на который указывает this при вызове конструктора.


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