Много слышал хорошего об Evernote от разных людей. Очень хочется пользоваться им, но останавливает то, что все данные привязаны к их сайту. Если они решат свернуть свой бизнес, то вся моя база данных пойдет коту под хвост. Поэтому использую старомодный org-mode для Emacs и Dropbox.
Что интересно, такой трюк должен работать в Firefox. В багтрекере Chrome знают об этом с 2010 года. Любопытно, сначала они закрыли тикет (wontfix), а потом всё же решили разобраться с этой ситуацией. Пока что разбираются.
По поводу вашего оригинального вопроса. Не совсем понимаю, почему нужно call вызывать дважды. Первый раз мы получаем тело объекта-функции Function.prototype.call. Второй call опять же получает себя, так как мы обращаемся к тому же самому методу но через экземпляр нашего объекта-функции.
Когда человек, который хочет инициализировать объект Logger увидит такой код, ему придётся потратить время, чтобы разобраться, как работает конструктор, что неоправданно усложняет код. Я попытался скрыть детали реализации. :)
Передавать в логгер вместе с функцией скоп вызова?
Тоже вариант. Но, по-видимому, лучше использовать bind(), так как с ним знакомо несравнимо большее количество людей, чем с Logger (смысл-то остаётся такой же).
Если я правильно разобрался, то это лишь касается только встроенных функций, так как такие функции ожидают, что this равен window (или, к примеру, console). Достаточно обернуть встроеную функцию в свою, чтобы это исправить. Например, такой аргумент сработает.
console.myLog = function(message) { console.log(message) };
var logger2 = new Logger(console.myLog);
logger2.log("Hi!");
logger2.log("Wazzup?");
// Sat Oct 04 2014 09:30:04 GMT+0300 (EEST): Hi!
// Sat Oct 04 2014 09:30:04 GMT+0300 (EEST): Wazzup?
Однако оба таких решения не самые изящные, так как нам везде придётся использовать либо bind(), либо function. Можно пойти другим путём и байндить встроенные функции к window внутри тела log. Функция isNative взята из внешних источников.
Однако такой трюк с console не пройдёт (и другими встроенными объектами, содержащими встроенные своёства наподобие console.log. Я не придумал, как это обойти.
Мне нравится атмосфера этого города. Например, стоишь в очереди, в супермаркете, а впереди тебя люди разговаривают о MongoDB. Много крупных айти-событий происходит именно в Сан-Франциско. После местных реалий мне уже не стрёмно сворачивать «не туда» :) Не спорю, может быть где-то и лучше, но я там не был.
А ещё мне нравится идея того, что работая там намного легче накопить на своё собственное жильё здесь.
Так короче и чтобы не повторяться. Если бы я писал по-английски, то использовал бы «SF». Но в русском, насколько мне известно, «СФ» не распространено, так что я придумал своё сокращение. Про Фриско не слышал раньше (только про Фриске). А вы сетевик? :)
Кстати, символы в Ruby 2.1 и ниже не собираются сборщиком мусора. В 2.2 уже собираются.
Ваша статья напомнила мне об известном свойстве Руби, когда память под строку длиной 24 и более символов выделяется очень медленно.
console.log
от контекстаconsole
. Я не силён в C+, но ответ на все вопросы и всё такое существует.Хоть там и объясняется что к чему, однако всё равно не понятна разница между legal и illegal.
Что интересно, такой трюк должен работать в Firefox. В багтрекере Chrome знают об этом с 2010 года. Любопытно, сначала они закрыли тикет (wontfix), а потом всё же решили разобраться с этой ситуацией. Пока что разбираются.
По поводу вашего оригинального вопроса. Не совсем понимаю, почему нужно
call
вызывать дважды. Первый раз мы получаем тело объекта-функцииFunction.prototype.call
. Второйcall
опять же получает себя, так как мы обращаемся к тому же самому методу но через экземпляр нашего объекта-функции.Отличный пример, спасибо! Стало понятнее. Можно упростить до такого:
Теперь очень ясно видно, почему
bind()
так называется: он как бы склеивает методы.Когда человек, который хочет инициализировать объект
Logger
увидит такой код, ему придётся потратить время, чтобы разобраться, как работает конструктор, что неоправданно усложняет код. Я попытался скрыть детали реализации. :)Тоже вариант. Но, по-видимому, лучше использовать
bind()
, так как с ним знакомо несравнимо большее количество людей, чем сLogger
(смысл-то остаётся такой же).Если я правильно разобрался, то это лишь касается только встроенных функций, так как такие функции ожидают, что
this
равенwindow
(или, к примеру,console
). Достаточно обернуть встроеную функцию в свою, чтобы это исправить. Например, такой аргумент сработает.Однако оба таких решения не самые изящные, так как нам везде придётся использовать либо
bind()
, либоfunction
. Можно пойти другим путём и байндить встроенные функции кwindow
внутри телаlog
. ФункцияisNative
взята из внешних источников.Однако такой трюк с
console
не пройдёт (и другими встроенными объектами, содержащими встроенные своёства наподобиеconsole.log
. Я не придумал, как это обойти.А ещё мне нравится идея того, что работая там намного легче накопить на своё собственное жильё здесь.