Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Тут собираем годные задачи (javascript) (https://javascript.ru/forum/offtopic/32201-tut-sobiraem-godnye-zadachi-javascript.html)

Nekromancer 12.10.2012 01:33

Maxmaxmахimus,
в твоем примере создается 2 замыкания, для i и funcs, в поимере же от monolithed, создаётся же всего одно, вот зачем возвращать функцию.

DjDiablo 12.10.2012 01:43

Цитата:

в твоем примере создается 2 замыкания, для i и funcs,
Акстись у maxmaximus пример нерабочий, даже если дофантазировать что рабочий то где ты там два замыкания увидел ?

//переменная funcs существует вне замыкания если что
funcs=[];

(function(i){
 // замыкание 1 штука, а в нём переменная I !! 
 funcs.push( function(i){ alert(i) } )//невнимательая ошибка  от maxmaximus
})(1)
funcs[0]();
//здесь был дьябло


Чёто я херню какуюто пишу, 6 утра пойду-ка спать:D

Nekromancer 12.10.2012 02:06

Я думаю он просто забыл убрать I, когда копировал. По идее же, в обоих случаях должно создаваться 2 замыкания. Ну и возможно я был не прав, при должной оптимизации в обоих случаях может быть по одному замыканию. В общем надо подумать завтра, в долго играющем коде точно применяются такие оптимизации.

Nekromancer 12.10.2012 02:11

DjDiablo,
А тут вам самим нужно окститься, невнимательная ошибка новичков. Ну вот как это funcs существует вне замыкания, глобальный объект он, что какой то магический? Он точно так же замыкается первыми функциями и попадает scope chain (термин из es3, не помню термин из es5).

DjDiablo 12.10.2012 02:52

Отпусти меня чудо трава, я спать хочу :(

с точки зрения реализации javascript, замыкание на переменные глобального scope, или внешней функции это один и тот же механизм. Возможно просто потому что так проще писать интерпретатор :D.

Я и неспорю с тем что любая функция является замыканием. Но если мы будем называть любую функцию замыканием, вам некажется что будет путаница ?

Традиционно называют замыканиями именно вложенные функции, из традиционного определения я и исходил.

Однако даже исходя их традиционного определения, я пожалуй поспешил с утверждением что там не одного замыкания. funcs.push( function(i){ alert(i) } и быть может потянет за собой scope внешний функции, только фактом своего существования.

думаю это можно попробывать проверить так.
var ret= (function(){
      var test=100;
      return function(){ 
            eval ("alert"+"(test)");
      };
})()
ret();

врял ли интерпретатор знал что я буду использовать test, но если пример сработал, значит внешний scope был всё таки доступен.

Nekromancer 12.10.2012 03:00

DjDiablo,
Это традиционная ошибка или отговорка? Например в V8 и Chakra вызов кода внутри контекста эта функция, так что получается любая ваша функция вложенная. Вы не считаете, что путаницу вводите вы? Про вложенную функцию было написано здесь, на javascript.ru, и такое ощущение, что никто больше других статей не читал.

Цитата:

с точки зрения реализации javascript, замыкание на переменные глобального scope, или внешней функции это одно и тоже. Просто потому что так проще писать интерпритатор .
Да неужели :)

DjDiablo 12.10.2012 03:18

Цитата:

Да неужели
зуб даю :D :D :D

Цитата:

Это традиционная ошибка или отговорка
Я думаю это видимая часть айсберга.

Восприятие не вложенных функций как замыканий на практике недаёт каких либо выгод, в отличие от практической и осознанной применимости свойства замыканий у вложенных функций. Scope на глобальном уровне описывает понятие глобальные переменные, для переменных внутри функции обычно применяют понятие локальных переменных. Потребность использования scope в рассуждениях возникает только с введением вложенных функций.

можно сделать вывод, что существуют предпосылки для обьяснения только видимой и осознанно используемой части явления. Вот вам и корни "традиционного обьяснения замыканий".

Например в V8 и Chakra вызов кода внутри контекста эта функция - а вот об этом можно поподробнее ?

Просто продолжение рода - это тоже функция :D И вот я думаю, если скрипт начнёт мне показывать порно картинки, и я после просмотра пойду в гости к девушке, то будет ли справедливо утверждение что javascript вызвал мою функцию продолжения рода :D :D :D.

Может нужно остановится на каком то уровне абстракции а не пытаться обьяснять scope, при помощи описания процессов в транзисторах.

Nekromancer 12.10.2012 03:21

Цитата:

врял ли интерпритатор знал что я буду использовать test, но если пример сработал, значит внешний scope был всётаки доступен.
Когда в коде есть eval и когда его нету, происходит разная интерпритация. Когда есть eval, сохраняются все области видимости и их биндинги. Когда нету eval, области видимости могут не сохраняться, если они пустые, биндинги могут удалятся GC из-за того, что они не испульзуются и так далее. И по факту, замыканий будет в разы меньше.

Maxmaxmахimus 12.10.2012 04:00

Цитата:

Сообщение от Nekromancer
в твоем примере создается 2 замыкания, для i и funcs, в поимере же от monolithed, создаётся же всего одно, вот зачем возвращать функцию.

че за бред у нас у обоих одинаковое "количество" замыканий.

Цитата:

Сообщение от DjDiablo
Акстись у maxmaximus пример нерабочий, даже если дофантазировать что рабочий то где ты там два замыкания увидел ?

очевидно что мой пример не рабочий !! там даже цикла FOR нет!

Цитата:

Сообщение от Nekromancer
Я думаю он просто забыл убрать I, когда копировал. По идее же, в обоих случаях должно создаваться 2 замыкания. Ну и возможно я был не прав

уже лучше

Цитата:

Сообщение от DjDiablo
Чёто я херню какуюто пишу, 6 утра пойду-ка спать

ваще ДИКУЮ
__________________________________________________ __________________

я вообще в шоке с вас, все такие умные знают как скопчайны работают контексты и все дела, но иногда ТАКОЕ порите.... просто жесть

DjDiablo 12.10.2012 05:30

Цитата:

Когда в коде есть eval и когда его нету, происходит разная интерпритация. Когда есть eval, сохраняются все области видимости и их биндинги. Когда нету eval, области видимости могут не сохраняться, если они пустые, биндинги могут удалятся GC из-за того, что они не испульзуются и так далее. И по факту, замыканий будет в разы меньше.
Это звучит очень логично.

Значит эксперемент нечего не показал.
Я был уверен что замыкания не будет если из внешний функции не заимствоваются переменные, пока ты меня сомневаться не заставил.
Есть подтверждение что их меньше будет, или ты тоже предполагаешь? И так ли это во всех движках ?


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