Почему 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.
Ответы
Ответ 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')