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

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


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