Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Не работает console.log.apply(this,arguments) - Почему? (https://javascript.ru/forum/css-html/51082-ne-rabotaet-console-log-apply-arguments-pochemu.html)

Почемучкин 23.10.2014 18:30

Не работает console.log.apply(this,arguments) - Почему?
 
Для отладки использую такую функцию (упрощенно):
function log(){console.log.apply(this,arguments)}

Но в новых версиях Firefox это почему-то уже не работает, выдается ошибка:
TypeError: 'log' called on an object that does not implement interface Console.


Это работает:
console.log(new Date());

И это работает:
function log(){console.log(arguments)} 

log(new Date());


Это - теперь не работает:
function log1(){console.log.apply(this,arguments)} 

log1(new Date());

Пробовал и так, тоже не работает:
function log1(){window.console.log.apply(arguments.callee,arguments)} 

log1(new Date());


Для проверки запускал из консоли и из букмарклета.

Что я упустил?

Octane 23.10.2014 18:36

Ну наверное log из this пытается что-то взять, а ты подменяешь его.
Попробуй так:
var log = console.log.bind(console);

Sweet 23.10.2014 18:41

Надо так:
function log(){console.log.apply(console,arguments)}

Почемучкин 23.10.2014 18:54

Да, с this=console заработало :)

Только может объясните - почему раньше console.log.apply(this,arguments) работале, а теперь - нет? (Это началось кажется с Firefox30)

Просто чтобы знать - что изменилось, т.к. думаю, что это не последний случай, где с этим столкнусь?

Aetae 23.10.2014 21:31

Потому что this рандомный у тебя. В strict он бы тебя ещё и обругал за это. А так this == window.
Почему работало? Ну наверное просто не было проверки, и log не пытался ни к чему обращаться через this.

Чтоб "не сталкиваться" больше - почитай что такое this.

Почемучкин 23.10.2014 22:50

Тогда вопрос такой: почему в новых Firefox console.log.apply стал требовать только this=console,
и больше не хочет принимать этим аргументом window, как раньше?

Вообще ведь смысл функции apply - именно в том, чтобы передать через него свой this

danik.js 23.10.2014 22:57

var console = {
     log: function(arg) {
         this._realLog(arg);
     },
     _realLog: function(arg) {
        alert(arg);
    }
};

console.log('Так работает');

console.log.apply(this, ['А так нет']);

Теперь дошло?

danik.js 23.10.2014 23:00

https://developer.mozilla.org/en-US/...eb/API/Console

Вот если твой this реализует все эти методы, то скорее всего это сработает.

Почемучкин 31.10.2014 17:01

Ну а в связи с чем изменения-то?
Всю жизнь console.log.apply( window, arguments) работало без проблем.

Sweet 31.10.2014 17:17

Почемучкин, а почему window? В чём смысл? Я понимаю ещё вот так:
console.log.apply(null, arguments);

Ведь когда ты передаёшь контекст, это же зачем-то нужно. Хотя если жить по принципу "работает же, чё", то, конечно, без разницы:)


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