Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.02.2013, 00:47
Интересующийся
Отправить личное сообщение для ololosh Посмотреть профиль Найти все сообщения от ololosh
 
Регистрация: 25.07.2012
Сообщений: 27

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

function ololo(fn) {
	fn();
}

ololo(obj.what);


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


2) почему консоль фаербага не показывает ни одной ошибки при пустом алерте?
Ответить с цитированием
  #2 (permalink)  
Старый 20.02.2013, 00:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

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

function ololo(fn) {
	fn();
}
window.name = "bla bla"
ololo(obj.what);
Ответить с цитированием
  #3 (permalink)  
Старый 20.02.2013, 01:24
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Или через Function.prototype.bind (ES5)
Ответить с цитированием
  #4 (permalink)  
Старый 20.02.2013, 07:20
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

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

ololosh,
держи бро http://learn.javascript.ru/this
Ответить с цитированием
  #5 (permalink)  
Старый 20.02.2013, 08:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

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

И поскольку (как верно заметил)
Сообщение от рони
имя окна пусто
алерт пустой...

При таком варианте
Сообщение от ololosh
ololo(function() {   obj.what();})
Передаётся функция, в теле которой, вызывается метод объекта. Т.о. алерт показывает тебе значение свойства того объекта...

Сообщение от ololosh
почему консоль фаербага не показывает ни одной ошибки при пустом алерте?
Так ежели их нет - что показывать?
Ответить с цитированием
  #6 (permalink)  
Старый 20.02.2013, 08:56
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

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

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

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

передав метод обьекта в ololo ты как бы оторвал его от обьекта, и this больше не ссылается на обьект.
Ответить с цитированием
  #7 (permalink)  
Старый 20.02.2013, 08:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от megaupload
ОБЪЯСНЕНИЕ НОРМАЛЬНОЕ:
Не умер Данила, а яром придавило...
Ответить с цитированием
  #8 (permalink)  
Старый 20.02.2013, 09:40
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от megaupload
то он равен window
Точнее он равен глобальному объекту. В обычных случаях это window, в Node.js это вроде бы global, а в вебворкерах - не помню
Ответить с цитированием
  #9 (permalink)  
Старый 25.02.2013, 15:23
Интересующийся
Отправить личное сообщение для ololosh Посмотреть профиль Найти все сообщения от ololosh
 
Регистрация: 25.07.2012
Сообщений: 27

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

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


func() выводит алерт с undefined
Я ж делал все как тут нааписано:
http://learn.javascript.ru/bind
Ответить с цитированием
  #10 (permalink)  
Старый 25.02.2013, 15:32
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от ololosh
Я ж делал все как тут нааписано:
http://learn.javascript.ru/bind
Что именно? Приведи "тот" пример.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает простой спойлер (jquery) в Joomla dedmusos jQuery 2 27.12.2012 17:29
Вот пример кода на JS Он работает. А вот... Averin500 Events/DOM/Window 1 18.12.2012 22:45
JS работает в Опере, Хроме и Сафари, и не работает в IE & Mozilla Aliena Javascript под браузер 5 04.12.2010 08:15
$('#id') не работает для некоторых элементов tmvrus jQuery 10 12.10.2010 15:45
Работает в Mozilla и не работает в IE Maxidrom Events/DOM/Window 4 27.02.2010 16:37