Почему я не могу связать напрямую console.log в IE9 с открытыми инструментами разработчика?

С инструментами разработчика, открытыми в IE9, этот код работает:

var log = Function.prototype.bind(console.log, console);

Но если я наберу

console.log(console, console.log);
var log = console.log.bind(console);

тогда я получаю это:

SCRIPT438: объект не поддерживает свойство или метод 'bind

Зачем?

Это известная ошибка IE или нормальное поведение?

Влияет ли это на другие функции (у меня не было проблем с window.alert что тоже родное)?

2 ответа

Решение

Как говорит соответствующий ответ, это просто потому, что log функция от console объект в IE не наследуется от Function, Это хост-объект, и он использует любые правила, которые IE сочтет нужными.

Но это похоже на функцию. Вот почему с помощью Function.prototype.bind работает так же, как использование Array.prototype.forEach работает на массивоподобных объектах. (Подсказка: NodeLists и HTMLCollections.)

Это не ошибка как таковая, потому что нет никакой спецификации, говорящей о console объект. Уровень жизни DOM даже не упоминает об этом. Таким образом, каждый браузер реализует этот объект так, как он хочет.

И это значит, что window.alert Функция подвержена тем же проблемам. Нам повезло, что это работает так хорошо во всех браузерах.

Это IE. Смирись с этим. Хотя IE9 намного лучше, чем IE8, он все же намного хуже, чем другие современные браузеры.

Консоль является расширением DOM и не является частью ECMAScript. Поскольку он является хост-объектом, он не обязан наследоваться от "Object". В IE (9 и 8) консоль открывается только при открытой панели инструментов разработчика.

var log = Function.prototype.bind.call(console.log, console); 
log(60+90);//150
Другие вопросы по тегам