Цитата:
|
не, я не понмиаю зачем функцию ретурнить?
почему не сделать (function(i){ funcs.push( function(i){ alert(i) } ) })(i) например? почему не делть присваивание "внутри" самовызова? |
Цитата:
|
Потому, что try...catch в цикле это самое ужасное, что можно придумать. Проверка на ошибки в JSVM требует больших ресурсо затрат.
|
по этому на ней не акцентировали оптимизацию? так как ошибка там появляется сразу и выявление ошибки не должно замедлять скрипт
|
Цитата:
|
Цитата:
Область видимости переменной это конечно офигенно плодородная почва для споров, и размышлений. (осторожно сарказм) |
это НЕ дело вкуса, это НЕ эквивалентные записи хоть и работают одинакого, НЕТ логического обьяснения почему мы возвращаем функцию. по этому ты и перемудрил. я думаю суть замечания стала более понятной)?
|
Паражает то, что хром на андроиде в 2.5 раза быстрее фаерфокса в обоих тестах.
|
Maxmaxmахimus,
приходи 17го на мейл.ру конф, там тебе чувак из гугла расскажет, почему-что плохо. |
Maxmaxmахimus,
в твоем примере создается 2 замыкания, для i и funcs, в поимере же от monolithed, создаётся же всего одно, вот зачем возвращать функцию. |
Цитата:
//переменная funcs существует вне замыкания если что funcs=[]; (function(i){ // замыкание 1 штука, а в нём переменная I !! funcs.push( function(i){ alert(i) } )//невнимательая ошибка от maxmaximus })(1) funcs[0](); //здесь был дьябло Чёто я херню какуюто пишу, 6 утра пойду-ка спать:D |
Я думаю он просто забыл убрать I, когда копировал. По идее же, в обоих случаях должно создаваться 2 замыкания. Ну и возможно я был не прав, при должной оптимизации в обоих случаях может быть по одному замыканию. В общем надо подумать завтра, в долго играющем коде точно применяются такие оптимизации.
|
DjDiablo,
А тут вам самим нужно окститься, невнимательная ошибка новичков. Ну вот как это funcs существует вне замыкания, глобальный объект он, что какой то магический? Он точно так же замыкается первыми функциями и попадает scope chain (термин из es3, не помню термин из es5). |
Отпусти меня чудо трава, я спать хочу :(
с точки зрения реализации javascript, замыкание на переменные глобального scope, или внешней функции это один и тот же механизм. Возможно просто потому что так проще писать интерпретатор :D. Я и неспорю с тем что любая функция является замыканием. Но если мы будем называть любую функцию замыканием, вам некажется что будет путаница ? Традиционно называют замыканиями именно вложенные функции, из традиционного определения я и исходил. Однако даже исходя их традиционного определения, я пожалуй поспешил с утверждением что там не одного замыкания. funcs.push( function(i){ alert(i) } и быть может потянет за собой scope внешний функции, только фактом своего существования. думаю это можно попробывать проверить так. var ret= (function(){ var test=100; return function(){ eval ("alert"+"(test)"); }; })() ret(); врял ли интерпретатор знал что я буду использовать test, но если пример сработал, значит внешний scope был всё таки доступен. |
DjDiablo,
Это традиционная ошибка или отговорка? Например в V8 и Chakra вызов кода внутри контекста эта функция, так что получается любая ваша функция вложенная. Вы не считаете, что путаницу вводите вы? Про вложенную функцию было написано здесь, на javascript.ru, и такое ощущение, что никто больше других статей не читал. Цитата:
|
Цитата:
Цитата:
Восприятие не вложенных функций как замыканий на практике недаёт каких либо выгод, в отличие от практической и осознанной применимости свойства замыканий у вложенных функций. Scope на глобальном уровне описывает понятие глобальные переменные, для переменных внутри функции обычно применяют понятие локальных переменных. Потребность использования scope в рассуждениях возникает только с введением вложенных функций. можно сделать вывод, что существуют предпосылки для обьяснения только видимой и осознанно используемой части явления. Вот вам и корни "традиционного обьяснения замыканий". Например в V8 и Chakra вызов кода внутри контекста эта функция - а вот об этом можно поподробнее ? Просто продолжение рода - это тоже функция :D И вот я думаю, если скрипт начнёт мне показывать порно картинки, и я после просмотра пойду в гости к девушке, то будет ли справедливо утверждение что javascript вызвал мою функцию продолжения рода :D :D :D. Может нужно остановится на каком то уровне абстракции а не пытаться обьяснять scope, при помощи описания процессов в транзисторах. |
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
__________________________________________________ __________________ я вообще в шоке с вас, все такие умные знают как скопчайны работают контексты и все дела, но иногда ТАКОЕ порите.... просто жесть |
Цитата:
Значит эксперемент нечего не показал. Я был уверен что замыкания не будет если из внешний функции не заимствоваются переменные, пока ты меня сомневаться не заставил. Есть подтверждение что их меньше будет, или ты тоже предполагаешь? И так ли это во всех движках ? |
*наркоманы*
|
Небольшой тест на хроме.
Логично предположить что замыкания будут отражаться на расходе памяти. Пробую мерить расход памяти для 10 000 000 замыканий. Cначало прогонем без цикла - 5 340 (не одного замыкания) для alert (1) - 473 000 (здесь мы не тянем за собой scope) для alert (data) - 717 000 (здесь мы тянем за собой scope) для eval - БОЛТ :D, виснет, но для 1000 000 замыканий составляет 117 000, значит где то 1 170 000. для 10 000 000 Код теста var arr=[]; test=function(){ var data="893749237776876872346873264782364823647324823647326473647"; data=data+"893749237776876872346873264782364823647324823647326473647"; data=data+"893749237776876872346873264782364823647324823647326473647"; data=data+"893749237776876872346873264782364823647324823647326473647"; data=data+"893749237776876872346873264782364823647324823647326473647"; data=data+"893749237776876872346873264782364823647324823647326473647"; data=data+"893749237776876872346873264782364823647324823647326473647"; return function(){ eval(" alert"+"(data)"); //alert(data); //alert(1); } } for (var i=0;i<10000000;i++){ arr.push(test()); } выводы. -Замыкание пояляется только если мы используем переменные внешний функции -eval ощутимо увеличивает расход памяти на замыкания, к тому имеет проблемы с большим количеством. |
Цитата:
|
Задача № 1
function continueSequence(arr){ return function(){ var arrLength = arr.length; var gen = arr[arrLength - 1] - arr[arrLength - 2] + arr[arrLength - 1]; arr.push(gen); return gen; } } |
:lol: вы тоже проигрываете читая свои старые каменты на форуме?
|
Часовой пояс GMT +3, время: 14:07. |