Подтвердить что ты не робот

Почему console.log.apply() выдает ошибку Illegal Invocation?

Когда я запускаю следующий код в бета-версии Chrome 18, я получаю сообщение об ошибке:

console.log.apply(this, ['message']);

TypeError: незаконный вызов.

В Firefox 10 работает так, как ожидалось.

В IE9 я получаю ошибку: Object doesn't support property or method 'apply'.

Я предполагаю, что это связано с тем, как браузер реализовал console.log.

Почему он работает в Firefox, но не в Chrome и IE? Я надеюсь, что кто-то может пролить свет на причину этого и его последствий.

Вот исполняемый образец в JS Bin.

4b9b3361

Ответ 1

console и log являются объектами хоста. Их поведение зависит от реализации и в значительной степени не требуется для реализации семантики ECMAScript.

FWIW, ваш jsBin также не работает в Chrome, если вы не измените его на...

console.log.apply(console, ['message']);

но похоже, что log просто ожидает контекст вызова console.

Ответ 2

Здесь альтернативное решение. Я не уверен, что аргументы, которые не работают, работают нормально.

function logr(){
    var i = -1, l = arguments.length, args = [], fn = 'console.log(args)';
    while(++i<l){
        args.push('args['+i+']');
    };
    fn = new Function('args',fn.replace(/args/,args.join(',')));
    fn(arguments);
};
logr(1,2,3);
logr();
logr({},this,'done')