Pull to refresh

Comments 13

Насколько знаю v8 достаточно умен и в указанном примере не будет сохранять контекст замыкания для Task. Поправьте, если ошибаюсь
a(arg1, function() {
    var x1;
    b(arg2, function() {
    var x2;
    setInterval(function Task() {
        console.log('tik');
        }, interval);
    }); 
})
А как насчет eval?
function a(x2) {
    var x1 = 1;
    setInterval(function Task() {
        console.log(eval("x1 + x2"));
    }, 1000);
}

a(2);

Как V8 поймет, что там в eval, строка может динамически формироваться любая!
Если в функции используется eval, то уровень её оптимизации снижается, чтобы избежать таких вот потерь замкнутых переменных. Иначе не используемые замкнутые переменные будут уничтожены.

Пруф: Дэвид Фленаган — Javascript. Подробное руководство (2013) п. 4.12.2
а если console.log = eval произойдет где-то?
p.s. проверил тот код — память не освобождается (видимо как раз по этой причине)
в ECMAScript 3, если eval вызывается под любым другим именем (var a = eval; a("");) возбуждается исключение EvalError.

в ECMAScript 5, если eval вызывается под другим именем, в качестве окружения используется глобальный объект (window), а локальные переменные внутри компилируемой функции недоступны. Если же eval вызывать под своим именем, то локальные переменные доступны, а контекст выполнения тот же, что и у вызывающего кода.

Ну IE<=8, как всегда, отличился, у него eval под другим именем исполняется в локальном контексте.
p.s. если удалить console.log из Task, то замкнутые переменные уничтожаются и память освобождается
Вот об этом и писал, а если есть прецедент, то и рассматриваемая ситуация имеет место быть.
Мне стиль изложения показался очень сложным. Все время себя заставлял читать дальше, и даже закончив пошел в гугл искать для себя более ясное изложение.

Читая, хотелось понять почему Q а не async? В чем преимущества и недостатки? Какова производительность?
Вот например habrahabr.ru/post/168929/ автор отзывается не очень хорошо о Q именно из за проблем с производительностью.
Отвечаю самому себе.
Вот тут howtonode.org/promises очень хорошая статья. Просто и понятно.
О ссылке что выше, где человек рассказывает о проблемах с производительностью в Q. Резюме он его просто не умел готовить. В последствии исправил свой код и вышел на приемлемую производительность.
Это вводная статья для людей, которые начинают знакомиться с концепцией promise на примере библиотеки Q, вопросы производительности, сравнения их с другими библиотеками, детали реализации их, здесь не рассматривались
Вы извините, но со всеми вашими метафорами и аналогиями сохранить нить повествования крайне сложно. По-моему лучше прочитать readme у них на гитхабе, там все как-то проще и информативнее описано: github.com/kriskowal/q
Sign up to leave a comment.

Articles