12.10.2012, 01:33
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
Maxmaxmахimus,
в твоем примере создается 2 замыкания, для i и funcs, в поимере же от monolithed, создаётся же всего одно, вот зачем возвращать функцию.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
12.10.2012, 01:43
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Цитата:
|
в твоем примере создается 2 замыкания, для i и funcs,
|
Акстись у maxmaximus пример нерабочий, даже если дофантазировать что рабочий то где ты там два замыкания увидел ?
//переменная funcs существует вне замыкания если что
funcs=[];
(function(i){
// замыкание 1 штука, а в нём переменная I !!
funcs.push( function(i){ alert(i) } )//невнимательая ошибка от maxmaximus
})(1)
funcs[0]();
//здесь был дьябло
Чёто я херню какуюто пишу, 6 утра пойду-ка спать
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 12.10.2012 в 03:09.
|
|
12.10.2012, 02:06
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
Я думаю он просто забыл убрать I, когда копировал. По идее же, в обоих случаях должно создаваться 2 замыкания. Ну и возможно я был не прав, при должной оптимизации в обоих случаях может быть по одному замыканию. В общем надо подумать завтра, в долго играющем коде точно применяются такие оптимизации.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
12.10.2012, 02:11
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
DjDiablo,
А тут вам самим нужно окститься, невнимательная ошибка новичков. Ну вот как это funcs существует вне замыкания, глобальный объект он, что какой то магический? Он точно так же замыкается первыми функциями и попадает scope chain (термин из es3, не помню термин из es5).
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
12.10.2012, 02:52
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Отпусти меня чудо трава, я спать хочу
с точки зрения реализации javascript, замыкание на переменные глобального scope, или внешней функции это один и тот же механизм. Возможно просто потому что так проще писать интерпретатор .
Я и неспорю с тем что любая функция является замыканием. Но если мы будем называть любую функцию замыканием, вам некажется что будет путаница ?
Традиционно называют замыканиями именно вложенные функции, из традиционного определения я и исходил.
Однако даже исходя их традиционного определения, я пожалуй поспешил с утверждением что там не одного замыкания. funcs.push( function(i){ alert(i) } и быть может потянет за собой scope внешний функции, только фактом своего существования.
думаю это можно попробывать проверить так.
var ret= (function(){
var test=100;
return function(){
eval ("alert"+"(test)");
};
})()
ret();
врял ли интерпретатор знал что я буду использовать test, но если пример сработал, значит внешний scope был всё таки доступен.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 12.10.2012 в 14:50.
|
|
12.10.2012, 03:00
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
DjDiablo,
Это традиционная ошибка или отговорка? Например в V8 и Chakra вызов кода внутри контекста эта функция, так что получается любая ваша функция вложенная. Вы не считаете, что путаницу вводите вы? Про вложенную функцию было написано здесь, на javascript.ru, и такое ощущение, что никто больше других статей не читал.
Цитата:
|
с точки зрения реализации javascript, замыкание на переменные глобального scope, или внешней функции это одно и тоже. Просто потому что так проще писать интерпритатор .
|
Да неужели
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
12.10.2012, 03:18
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
зуб даю
Цитата:
|
Это традиционная ошибка или отговорка
|
Я думаю это видимая часть айсберга.
Восприятие не вложенных функций как замыканий на практике недаёт каких либо выгод, в отличие от практической и осознанной применимости свойства замыканий у вложенных функций. Scope на глобальном уровне описывает понятие глобальные переменные, для переменных внутри функции обычно применяют понятие локальных переменных. Потребность использования scope в рассуждениях возникает только с введением вложенных функций.
можно сделать вывод, что существуют предпосылки для обьяснения только видимой и осознанно используемой части явления. Вот вам и корни "традиционного обьяснения замыканий".
Например в V8 и Chakra вызов кода внутри контекста эта функция - а вот об этом можно поподробнее ?
Просто продолжение рода - это тоже функция И вот я думаю, если скрипт начнёт мне показывать порно картинки, и я после просмотра пойду в гости к девушке, то будет ли справедливо утверждение что javascript вызвал мою функцию продолжения рода .
Может нужно остановится на каком то уровне абстракции а не пытаться обьяснять scope, при помощи описания процессов в транзисторах.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 12.10.2012 в 05:42.
|
|
12.10.2012, 03:21
|
|
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
Цитата:
|
врял ли интерпритатор знал что я буду использовать test, но если пример сработал, значит внешний scope был всётаки доступен.
|
Когда в коде есть eval и когда его нету, происходит разная интерпритация. Когда есть eval, сохраняются все области видимости и их биндинги. Когда нету eval, области видимости могут не сохраняться, если они пустые, биндинги могут удалятся GC из-за того, что они не испульзуются и так далее. И по факту, замыканий будет в разы меньше.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
12.10.2012, 04:00
|
|
司会
|
|
Регистрация: 29.02.2012
Сообщений: 198
|
|
Сообщение от Nekromancer
|
в твоем примере создается 2 замыкания, для i и funcs, в поимере же от monolithed, создаётся же всего одно, вот зачем возвращать функцию.
|
че за бред у нас у обоих одинаковое "количество" замыканий.
Сообщение от DjDiablo
|
Акстись у maxmaximus пример нерабочий, даже если дофантазировать что рабочий то где ты там два замыкания увидел ?
|
очевидно что мой пример не рабочий !! там даже цикла FOR нет!
Сообщение от Nekromancer
|
Я думаю он просто забыл убрать I, когда копировал. По идее же, в обоих случаях должно создаваться 2 замыкания. Ну и возможно я был не прав
|
уже лучше
Сообщение от DjDiablo
|
Чёто я херню какуюто пишу, 6 утра пойду-ка спать
|
ваще ДИКУЮ
__________________________________________________ __________________
я вообще в шоке с вас, все такие умные знают как скопчайны работают контексты и все дела, но иногда ТАКОЕ порите.... просто жесть
Последний раз редактировалось Maxmaxmахimus, 12.10.2012 в 04:08.
|
|
12.10.2012, 05:30
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Цитата:
|
Когда в коде есть eval и когда его нету, происходит разная интерпритация. Когда есть eval, сохраняются все области видимости и их биндинги. Когда нету eval, области видимости могут не сохраняться, если они пустые, биндинги могут удалятся GC из-за того, что они не испульзуются и так далее. И по факту, замыканий будет в разы меньше.
|
Это звучит очень логично.
Значит эксперемент нечего не показал.
Я был уверен что замыкания не будет если из внешний функции не заимствоваются переменные, пока ты меня сомневаться не заставил.
Есть подтверждение что их меньше будет, или ты тоже предполагаешь? И так ли это во всех движках ?
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 12.10.2012 в 06:17.
|
|
|
|