Проблемы с 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')]);:-) |
FINoM,
У тебя в обоих случаях проблема с контекстом вызова, может стоит статейку прочесть? :) |
Nekromancer, та нет, вроде всё понял.
Я просто думал, что log — статичный метод console, у которого контекст — окно. Просто тупанул. |
B@rmaley.e><e,
ты просто не представляешь как ты мне помог с классами!!!! спасибо ОГРОМНОЕ!!! |
Цитата:
мля это шикарно)!! |
Часовой пояс GMT +3, время: 15:14. |