Pull to refresh
30
0
Kyrylo Silin @kyrylo

User

Send message
Кстати, размер реального текущего слота можно получить вот таким способом.

GC::INTERNAL_CONSTANTS[:RVALUE_SIZE] #=> 40
Понял. Нужно было уточнить, что я комментировал последний абзац.

Кстати, символы в Ruby 2.1 и ниже не собираются сборщиком мусора. В 2.2 уже собираются.
А вы со строками проверяли?

Ваша статья напомнила мне об известном свойстве Руби, когда память под строку длиной 24 и более символов выделяется очень медленно.
Много слышал хорошего об Evernote от разных людей. Очень хочется пользоваться им, но останавливает то, что все данные привязаны к их сайту. Если они решат свернуть свой бизнес, то вся моя база данных пойдет коту под хвост. Поэтому использую старомодный org-mode для Emacs и Dropbox.
Потому что мы не отрываем console.log от контекста console. Я не силён в C+, но ответ на все вопросы и всё такое существует.

Хоть там и объясняется что к чему, однако всё равно не понятна разница между legal и illegal.

Что интересно, такой трюк должен работать в Firefox. В багтрекере Chrome знают об этом с 2010 года. Любопытно, сначала они закрыли тикет (wontfix), а потом всё же решили разобраться с этой ситуацией. Пока что разбираются.
А вот так тоже работает.

Скрытый текст
[ function(){console.log(1)}, function(){console.log(2)} ].forEach(Function.prototype.call, Function.prototype.call)



По поводу вашего оригинального вопроса. Не совсем понимаю, почему нужно call вызывать дважды. Первый раз мы получаем тело объекта-функции Function.prototype.call. Второй call опять же получает себя, так как мы обращаемся к тому же самому методу но через экземпляр нашего объекта-функции.
s/склеивает/приклеивает/
Подозреваю, что имелся в виду этот код.

var obj = {
    value: 5,
    foo: function() { console.log(this.value); } // [исправлено]
};

obj.foo(); // 5
var foo = obj.foo; // [исправлено]
foo(); // undefined


Отличный пример, спасибо! Стало понятнее. Можно упростить до такого:

var log = console.log;
log('Hello'); // TypeError: Illegal invocation

log.bind(console)('World'); // => World


Теперь очень ясно видно, почему bind() так называется: он как бы склеивает методы.
А чем вам bind не изящный?


Когда человек, который хочет инициализировать объект Logger увидит такой код, ему придётся потратить время, чтобы разобраться, как работает конструктор, что неоправданно усложняет код. Я попытался скрыть детали реализации. :)

Передавать в логгер вместе с функцией скоп вызова?


Тоже вариант. Но, по-видимому, лучше использовать bind(), так как с ним знакомо несравнимо большее количество людей, чем с Logger (смысл-то остаётся такой же).
Кажется, для последнего примера достаточно и такого кода (убрал ненужное присвоение):

Logger = function(logFn) {
  this.log = function(message) {
    logFn(new Date() + ": " + message);
  };
}


Если я правильно разобрался, то это лишь касается только встроенных функций, так как такие функции ожидают, что 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 взята из внешних источников.

var Logger = function(logFn) {
  if (isNative(logFn)) {
    this.log = function(message) {
      logFn.bind(window)(new Date() + ": " + message);
    };
  } else {
    this.log = function(message) {
      logFn(new Date() + ": " + message);
    };
  }
}

var logger3 = new Logger(alert);

logger3.log("Hi!");
logger3.log("Wazzup?");


Однако такой трюк с console не пройдёт (и другими встроенными объектами, содержащими встроенные своёства наподобие console.log. Я не придумал, как это обойти.
А какие уже есть книги? Я даже и не думал, что про это пишут.
Это было давно очень, когда я только начинал. Потом я попал в контору и в силу особенностей нашего законодательства стал ЧП.
Да. Сделал уточнение в начале статьи. Спасибо!
Подтверждаю. В компании, где я стажировался два основателя, и работают они не покладая рук.
Мне нравится атмосфера этого города. Например, стоишь в очереди, в супермаркете, а впереди тебя люди разговаривают о MongoDB. Много крупных айти-событий происходит именно в Сан-Франциско. После местных реалий мне уже не стрёмно сворачивать «не туда» :) Не спорю, может быть где-то и лучше, но я там не был.

А ещё мне нравится идея того, что работая там намного легче накопить на своё собственное жильё здесь.
Пригласил товарищ по команде одного open source проекта, в котором мы участвовали.
Так короче и чтобы не повторяться. Если бы я писал по-английски, то использовал бы «SF». Но в русском, насколько мне известно, «СФ» не распространено, так что я придумал своё сокращение. Про Фриско не слышал раньше (только про Фриске). А вы сетевик? :)

Information

Rating
Does not participate
Location
Харьков, Харьковская обл., Украина
Registered
Activity