Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Из книги Фленаган (https://javascript.ru/forum/misc/60949-iz-knigi-flenagan.html)

uanr81 28.01.2016 13:54

Из книги Фленаган
 
Здравствуйте. В книге Фленагана есть листинг
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);

vasa_c 28.01.2016 14:04

Наверное в хроме не просто ошибка. Наверное хром написал что за ошибка.

uanr81 28.01.2016 14:18

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

Uncaught TypeError: Illegal invocation

nerv_ 28.01.2016 15:42

r.foreach(console.log.bind(console)); //(**)

uanr81 28.01.2016 19:52

Получается контекст теряется? А в книге что очепятки?

vasa_c 29.01.2016 08:26

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

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


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