Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Проблемы с console.log (https://javascript.ru/forum/offtopic/25703-problemy-s-console-log.html)

FINoM 13.02.2012 05:46

Проблемы с 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);
}


Почему так?

Mахmахmахimus 13.02.2012 06:21

потому что log лежит в прототипе консолей и должен вызываться относительно инстанса консоли, чтобы знал В КАКУЮ консоль рисовать.

var q = console;
q.log('ня!')


а вообще держи)
function log(){console.log.apply(console, arguments)}

FINoM 13.02.2012 07:34

Цитата:

Сообщение от Mахmахmахimus
function log(){console.log.apply(console, arguments)}

Хах, ловко.
Цитата:

Сообщение от Mахmахmахimus
потому что log лежит в прототипе консолей и должен вызываться относительно инстанса консоли, чтобы знал В КАКУЮ консоль рисовать.

console есть в window.

В общем да, с apply я неплохо так тупанул, но вот первое и второе меня сильно удивляет.

FINoM 13.02.2012 08:05

Не очень по теме, но почему выдает ошибку?
hasOwn = Object.prototype.hasOwnProperty.call;
o = {a:1};
hasOwn(o, 'a'); //TypeError: object is not a function

FINoM 13.02.2012 08:08

По сабжу:

У Стояна работает :D

poorking 13.02.2012 08:11

Цитата:

Сообщение от FINoM
Не очень по теме, но почему выдает ошибку?
hasOwn = Object.prototype.hasOwnProperty.call;
o = {a:1};
hasOwn(o, 'a'); //TypeError: object is not a function

FINoM,
Как почему? потому что call - метод Function, а вы его вызываете в контексте window

Цитата:

Сообщение от FINoM
У Стояна работает

Это точно опечатка, там в начале книги есть ссылка на страницу с опечатками, может она там есть, это ж единственное первое издание?

FINoM 13.02.2012 08:19

Цитата:

Сообщение от poorking
Как почему? потому что call - метод Function, а вы его вызываете в контексте window

Что-то я запутался. Я же копирую ссылку на функцию и вызываю её в контексте объекта.

poorking 13.02.2012 08:43

Цитата:

Сообщение от FINoM
hasOwn = Object.prototype.hasOwnProperty.call;

Вы копируете ссылку на Function.prototype.call

Mахmахmахimus 13.02.2012 15:01

Цитата:

Сообщение от poorking
Вы копируете ссылку на Function.prototype.call

call это функция)FINoM,
this в ВЫЗЫВАЕМОЙ функции будет самый первый слева после точки обьект, или если точки нет, то window.
call работает с this'ом пытаясь его вызвать по особому, и ожидает на его месте увидить функцию.
ты же вызываешь call() без точки , соответствено this'ом будет window.


this зависит от формы вызова)!

B@rmaley.e><e 13.02.2012 17:23

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, время: 23:09.