На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (66) « Первая ... 61 62 [63] 64 65 ... Последняя »  ( Перейти к последнему сообщению )  
> JS и его "недостатки"
    Цитата applegame @
    Контекста выше не существует, он убит при выходе из функции get(). Ну думаешь же ты, что интерпретатор сохраняет все контексты выше замыкания? Это был бы сущий кошмар.

    Не все контексты выше замыкания, а тот контекст в котором была создана вложенная функция.
      Цитата Serafim @
      Сохраняет =)
      ну точнее должен, но на внутреннем уровне это реализовано скорее всего именно ссылкой, как ты сказал
        Цитата Serafim @
        Сохраняет =)

        ВСЕ контексты? Да ну нафиг... По-моему нет :scratch:
          Цитата Астарот @
          ВСЕ контексты? Да ну нафиг... По-моему нет

          все, где есть var'ы, т.к. повторюсь, если по-русски, то var - это приватная статическая переменная =)
            Цитата Serafim @
            Сохраняет =) Если переводить на русский язык - var - это приватная статическая переменная
            А если в этом контексте триллиарды огромных объектов, которые более не используются? Они что тоже будут жить вместе с замыканием?
              Не, он скорее всего будет сохранять вплоть до того контекста, к которому есть обращение. То есть если из замыкания мы обращаемся к переменной в глобальной области видимости, то он и ее сохранит. Наверное... Надо бы кодом проверить.

              Добавлено
              Цитата applegame @
              А если в этом контексте триллиарды огромных объектов, которые более не используются?

              Думаю он чистит контекст от тех объектов, к которым нет обращения - нафиг они нужны, если их никто не запрашивает?
                Цитата Астарот @
                Не все контексты выше замыкания, а тот контекст в котором была создана вложенная функция.
                Вообще-то замыкание может сцапать переменную на сколько угодно контекстов выше: http://ideone.com/VipqFU
                  т.е. если перекладывать всё на русский, то получаем:
                  ExpandedWrap disabled
                    function any(){ // функция или конструктор
                    }
                    any.some = 23; // публичное статическое свойство
                    any.prototype.some = 23; // публичное свойство инстанса
                    var some = 23 // приватное статическое свойство у window

                  и если немного усложнить, т.е. добавить всё это в единый контекст:
                  ExpandedWrap disabled
                    (function(){ // замыкание
                      var some = 23; // приватное статическое свойство этого замыкания
                      function any(){ // конструктор или функция
                        this.some = 23; // либо контекст инстанса, либо контекст функции (в зависимости от того, как вызываешь)
                      }
                      any.some = 23; // публичное статическое свойство
                      any.prototype.some = 23; // публичное свойство инстанса
                    })();


                  в последнем примере мы имеем контекст всех операций - это замыкание, но не можем к нему обратиться, например к asd(), т.к. мы сокрыли его внутри этого замыкания. В таком случае нужно функцию вывести наружу, а результат замыкания присвоить к переменной:
                  ExpandedWrap disabled
                    var asd = (function(){
                      function asd(){
                      }
                      return asd;
                    })();

                  В этом случае мы к переменной var asd присвоили ссылку на функцию function asd(){} во внутреннем контексте. Как-то так =)
                    Впрочем, похоже Serafim прав, оно хранит всю цепочку контекстов. Если двиг JS достаточно умный, то лишние переменные, на которые в коде нет ссылок он может повыкидывать.
                    По сути в замыкание передается не ссылка на саму переменную, а ссылка на контекст с этой переменной.

                    Добавлено
                    Serafim, да это мы все знаем. Интересовали технические тонкости внутренней реализации. Вут тут надыбал понятно разжевано и по-русски :) http://learn.javascript.ru/closures
                    Сообщение отредактировано: applegame -
                      Цитата applegame @
                      а ссылка на объект с этой переменной.

                      на контекст, т.к. функция - это не совсем объект, это скорее класс =)
                        Цитата Serafim @
                        на контекст, т.к. функция - это не совсем объект, это скорее класс =)
                        я уже поправил, оговорка так-сказать :D
                        Сообщение отредактировано: applegame -
                          Цитата applegame @
                          Интересовали технические тонкости внутренней реализации.

                          ну тут на уровне магии всё, имхо. Курить V8 мне пока религия не позволяет :D
                            Кложуры в других языках устроены по другому. Скажем в C++ или D, все гораздо силнее оптимизированно и лишний хлам в памяти не держится.
                              Цитата applegame @
                              Вообще-то замыкание может сцапать переменную на сколько угодно контекстов выше: http://ideone.com/VipqFU

                              Так к ней явное обращение есть - таки да, как я и сказал, сцапает. А вот сцапает ли соседнюю переменную к которой нет обращения - вопрос...

                              Добавлено
                              Цитата applegame @
                              Впрочем, похоже Serafim прав, оно хранит всю цепочку контекстов. Если двиг JS достаточно умный, то лишние переменные, на которые в коде нет ссылок он может повыкидывать.

                              Легко проверить положив в контекст что-то ТЯЖЕЛОЕ, что б было в таскманагере видно, как приросла память, и поиграть удалением обращения к этому объекту.
                                Цитата applegame @
                                Кложуры в других языках устроены по другому

                                я выше приводил в пример сравнение JS замыканий и PHP. Там было видно, что во втором переменные как раз передаются внутрь замыкания и доступа к внешнему контексту у них нет =) В первом же - наоборот
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1557 ]   [ 14 queries used ]   [ Generated: 25.08.26, 02:44 GMT ]