Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.01.2016, 13:54
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Из книги Фленаган
Здравствуйте. В книге Фленагана есть листинг
function Range(from, to) {
    this.from = from;
    this.to = to;
}
Range.prototype = {
    includes: function(x) { return this.from <= x && x <= this.to; },
    foreach: function(f) {//(**)
        for(var x = Math.ceil(this.from); x <= this.to; x++) f(x);//(***)
    },
    toString: function() { return "(" + this.from + "..." + this.to + ")"; }
};
var r = new Range(1,3);   
r.includes(2);            
r.foreach(console.log); //(**)  
console.log(r);
В строке (***) при запуске в Chrome ошибка. Проясните почему? Если изменить немного код определения функции в строке (**) то сработает
function consoleLog(){// обвертываем console.log
	return function(x){
		console.log(x);
	}
}
function Range(from, to) {
    this.from = from;
    this.to = to;
}
Range.prototype = {
    includes: function(x) { return this.from <= x && x <= this.to; },
    foreach: function(func) {
        var ff = func();//разворачиваем обвёртку 
		for(var x = Math.ceil(this.from); x <= this.to; x++) ff(x);
    },
    toString: function() { return "(" + this.from + "..." + this.to + ")"; }
};
var r = new Range(1,3);   
r.includes(2);            
r.foreach(consoleLog); //передаём в аргумент обвертку  
console.log(r);
Ответить с цитированием
  #2 (permalink)  
Старый 28.01.2016, 14:04
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Наверное в хроме не просто ошибка. Наверное хром написал что за ошибка.
Ответить с цитированием
  #3 (permalink)  
Старый 28.01.2016, 14:18
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Простите ошибка в Chrome
for(var x = Math.ceil(this.from); x <= this.to; x++) f(x);//здесь ошибка

Uncaught TypeError: Illegal invocation
Ответить с цитированием
  #4 (permalink)  
Старый 28.01.2016, 15:42
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

r.foreach(console.log.bind(console)); //(**)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 28.01.2016, 19:52
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Получается контекст теряется? А в книге что очепятки?
Ответить с цитированием
  #6 (permalink)  
Старый 29.01.2016, 08:26
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Что контекст теряется это и так очевидно.
Другое дело зачем по-сути статической функции log нужен этот контекст.

В FF это нормально работает. В Chrome нужен контекст.
Видимо, во времена Флэнагана всё работало )
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
правельно подобрал себе книги ww3 Оффтопик 2 08.02.2015 11:25
Цикл из книги Javascript библия yourseowork Учебные материалы 8 19.08.2013 11:23
Три книги по JavaScript... Почемучкин Учебные материалы 12 30.11.2011 22:52
Книги по JavaScript (Sandr) Сайт Javascript.ru 6 23.06.2011 12:27
Пример из книги Ajax на практике Sadd AJAX и COMET 5 10.04.2010 18:20