Проблемы с console.log
Не проверял в других браузерах, но в Хроме нельзя использовать console.log как обычную функцию:
1. x = console.log; // function log() { [native code] } x('blah'); //TypeError: Illegal invocation 2. x = function(logger,arg){logger(arg)} x(console.log, 5); //TypeError: Illegal invocation 3. console.log.apply(window,[1,2,3]); //TypeError: Illegal invocation Особенно последнее очень неприятно, когда хочешь сделать логгер: log = function(){ console.log.apply(window,arguments); } Почему так? |
потому что log лежит в прототипе консолей и должен вызываться относительно инстанса консоли, чтобы знал В КАКУЮ консоль рисовать.
var q = console; q.log('ня!') а вообще держи) function log(){console.log.apply(console, arguments)} |
Цитата:
Цитата:
В общем да, с apply я неплохо так тупанул, но вот первое и второе меня сильно удивляет. |
Не очень по теме, но почему выдает ошибку?
hasOwn = Object.prototype.hasOwnProperty.call; o = {a:1}; hasOwn(o, 'a'); //TypeError: object is not a function |
|
Цитата:
Как почему? потому что call - метод Function, а вы его вызываете в контексте window Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
this в ВЫЗЫВАЕМОЙ функции будет самый первый слева после точки обьект, или если точки нет, то window. call работает с this'ом пытаясь его вызвать по особому, и ожидает на его месте увидить функцию. ты же вызываешь call() без точки , соответствено this'ом будет window. this зависит от формы вызова)! |
x = console.log.bind(console); x('blah'); hasOwn = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty); o = {a:1}; alert([hasOwn(o, 'a'), hasOwn(o, 'b')]);:-) |
Часовой пояс GMT +3, время: 19:09. |