Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обертка на console.log (https://javascript.ru/forum/misc/30686-obertka-na-console-log.html)

German Malinovskiy 12.08.2012 14:24

Обертка на console.log
 
Нашел вот такой кусок кода.
var Logger = {};
Logger.log = function () {
    if (window.console && console.log) {
        try {
            console.log.apply(console, arguments)
        } catch (e) {
            console.log(Array.slice(arguments))
        }
    }
};

У меня возникли следующие вопросы:
1. Зачем проверять window.console, разве нельзя обойтись просто проверкой console.log?
2. console.log.apply(console, arguments) по сути ничего не меняет? Ведь this передается тот же console что и был. Тогда смысл в функции Logger.log, если она предположительно тоже самое делает что и console.log? Может я что-то не уловил?

vadim5june 12.08.2012 14:33

Цитата:

Сообщение от German Malinovskiy
Зачем проверять window.console, разве нельзя обойтись просто проверкой console.log?

если Вы эту проверку не сделаете а console не определена то программа остановится в этом месте

Цитата:

Сообщение от German Malinovskiy
предположительно тоже самое делает что и console.log

она здесь какую то ошибку выведет в случае неудачи-я думаю в этом разница

German Malinovskiy 12.08.2012 14:41

почему тогда нельзя написать вместо
console.log.apply(console, arguments)

просто
console.log(arguments)

это что-то поменяет?

B@rmaley.e><e 12.08.2012 15:07

Да. Function#apply

vadim5june 12.08.2012 15:08

Цитата:

Сообщение от German Malinovskiy (Сообщение 196914)
почему тогда нельзя написать вместо
console.log.apply(console, arguments)

просто
console.log(arguments)

это что-то поменяет?

если apply то аргументы у нас как массив передаются
var result = function.apply(thisArg[, argsArray]);
а если без нее то строка аргументов-то есть это неравнозначное написание
общий смысл функции что она предотвращает некоторые ошибки по сравнению с написанием console.log

German Malinovskiy 12.08.2012 15:24

если не трудно приведи, пожалуйста, несколько ошибок по твоему мнению которые будут предотвращаться, по сравнению с обычным console.log для полной картины понимания

B@rmaley.e><e 12.08.2012 16:00

German Malinovskiy, предлагаю рассмотреть функцию Math.max, возвращающую максимум из её аргументов. Тогда для поиска максимума массива
var a = [-1, 10, 11, 0, -5, -9];

alert(Math.max(a)); // NaN — непонятно, как выбирать максимальный массив
alert(Math.max.apply(Math, a)); // ок — выбираем максимум из массива
Во втором случае запись эквивалентна Math.max(-1, 10, 11, 0, -5, -9).

German Malinovskiy 14.08.2012 16:56

Насколько я разобрался это обертка, для того чтобы вызывать console.log c произвольным числом аргументов (console.log.apply(console, arguments), хотя вроде console.log он и так принимает несколько аргументов) и еще ловит какие-то исключения, которые бросает console.log (чтобы не прерывать выполнение скрипта?)

Aetae 14.08.2012 17:58

console.log - он разный бывает, и файербаговский и хромовский и самописный встречается...

А функция делает следующее:
var Logger = {}; //создаётся объект Logger
Logger.log = function () { //создаётся функция log
    if (window.console && console.log) { //проверяют наличие console вообще и console.log ы яастности.(если сразу проверять console.log при отсутствующем console - будет ошибка)
        try {
            console.log.apply(console, arguments) // пытаются передать все принятые функцией Logger.log аргументы по отдельности, как еслибы вызов шёл напрямую
        } catch (e) { //если действие законцилось ошибкой(console.log почеу-то не захотел принимать много аргументов)
            console.log(Array.slice(arguments)) //передаём в console.log массив состоящий из переданых аргументов
        }
    }
};


Часовой пояс GMT +3, время: 07:30.