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

monolithed 12.10.2012 01:19

Цитата:

Сообщение от Maxmaxmахimus
А ТАК ЖЕ, в чем ты перемудрил? Отвечаю: ЗАЧЕМ одна функция ретурнит другую?

Потому что требуется вызов функции, иначе будет SyntaxError

Maxmaxmахimus 12.10.2012 01:21

не, я не понмиаю зачем функцию ретурнить?

почему не сделать

(function(i){

 funcs.push( function(i){ alert(i) } )

})(i)


например? почему не делть присваивание "внутри" самовызова?

monolithed 12.10.2012 01:22

Цитата:

Сообщение от Maxmaxmахimus
почему?

потому что try/catch нужно использовать только по назначению и в крайних случаях.

Nekromancer 12.10.2012 01:23

Потому, что try...catch в цикле это самое ужасное, что можно придумать. Проверка на ошибки в JSVM требует больших ресурсо затрат.

Maxmaxmахimus 12.10.2012 01:23

по этому на ней не акцентировали оптимизацию? так как ошибка там появляется сразу и выявление ошибки не должно замедлять скрипт

monolithed 12.10.2012 01:23

Цитата:

Сообщение от Maxmaxmахimus
не, я не понмиаю зачем функцию ретурнить?

Ну же объяснил... в остальном дело вкуса и особенностей задачи.

DjDiablo 12.10.2012 01:24

Цитата:

Сообщение от maxmaximus
чтобы использовать еще раз фиксированный i придется опять создавать саморазвивающеюся функцию

саморазвивающиеся функции maxmaximus'а скоро поработят человечество :D :D :D

Область видимости переменной это конечно офигенно плодородная почва для споров, и размышлений. (осторожно сарказм)

Maxmaxmахimus 12.10.2012 01:26

это НЕ дело вкуса, это НЕ эквивалентные записи хоть и работают одинакого, НЕТ логического обьяснения почему мы возвращаем функцию. по этому ты и перемудрил. я думаю суть замечания стала более понятной)?

Nekromancer 12.10.2012 01:26

Паражает то, что хром на андроиде в 2.5 раза быстрее фаерфокса в обоих тестах.

Nekromancer 12.10.2012 01:29

Maxmaxmахimus,
приходи 17го на мейл.ру конф, там тебе чувак из гугла расскажет, почему-что плохо.

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 из-за того, что они не испульзуются и так далее. И по факту, замыканий будет в разы меньше.
Это звучит очень логично.

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

Maxmaxmахimus 12.10.2012 11:20

*наркоманы*

DjDiablo 12.10.2012 14:05

Небольшой тест на хроме.
Логично предположить что замыкания будут отражаться на расходе памяти.

Пробую мерить расход памяти для 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 ощутимо увеличивает расход памяти на замыкания, к тому имеет проблемы с большим количеством.

Nekromancer 12.10.2012 14:09

Цитата:

-Замыкание пояляется только если мы используем переменные внешний функции
-eval ощутимо увеличивает расход памяти на замыкания, к тому имеет проблемы с большим количеством.
Я это и писал в предидущих постах. По этому V8 быстр. Собственно когда есть eval, замыкаются все биндинги.

sn87 03.12.2015 01:31

Задача № 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;
  }
}

Mаxmaxmаximus 03.12.2015 02:36

:lol: вы тоже проигрываете читая свои старые каменты на форуме?


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