Почему я не могу связать напрямую console.log в IE9 с открытыми инструментами разработчика?
С инструментами разработчика, открытыми в IE9, этот код работает:
var log = Function.prototype.bind(console.log, console);
Но если я наберу
console.log(console, console.log);
var log = console.log.bind(console);
тогда я получаю это:
Зачем?
Это известная ошибка 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