Проблемы с 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, время: 21:55. |