Замыкания в Javascript
Вложений: 1
Очень много инфо о замыканих, но немного размыта информация самого смысла его использования.
Главный смысл замыканий сохранить локальную переменную после завершения функции и использовать при запуске 2-ого, 3-его, n-ого раза запуском главной функции в котором встроена внутренняя? <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> var fn = (function() { var numberOfCalls = 0; return function() { return ++ numberOfCalls; } })(); </script> </body> </html> Интересует, обычно функцию объявляют вначале круглые скобки, а затем фигурные и там список команд в фигурных, а здесь получается круглые и снова круглые? Разве так еще можно объявлять функцию? Речь про концовку Цитата:
Вот показал на скрине, функцию объявляют сразу с двумя подряд круглыми скобками что ли или это одновременно и объявление и вызов этой же функции? Разве так можно? |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Когда я присваиваю переменной fn функцию, а в ней еще внутренняя анонимная функция, переменная fn содержит ссылку на функцию в функции, то есть 2 функции или ссылку только на анонимную внутреннюю одну? |
Цитата:
|
Это все потому что стоит return function(),
А если бы return не стоял для вызова анонимной функции тогда все равно fn содержал бы ссылку на анонимную функцию или он содержит ссылку только на то что возвращает return главной функции fn? |
denis_alekss,
console.log(fn) |
denis_alekss,
если интересно уберите строку var numberOfCalls = 0; но сохраните прежний функционал и даже сделайте его более универсальным. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> var fn = (function() { var numberOfCalls = 0; return function() { return ++ numberOfCalls; } })(); console.log(fn());//1 console.log(fn());//2 console.log(fn());//3 var foo = (function() { /*var numberOfCalls = 0;*/ return function() { return ++ numberOfCalls; } })(); console.log(foo());//1 console.log(foo());//2 console.log(foo());//3 </script> </body> </html> |
Если запустить ваш вариант, вначале выдаст
1 2 3 А затем ошибку: Цитата:
Если так: var foo = (function() { /*var numberOfCalls = 0;*/ return function() { numberOfCalls = 0; return ++ numberOfCalls; } })(); Выведет 3 раза подряд цифру 1 вместо 1 2 3 |
denis_alekss,
обе функции должны выдавать одно и тоже, плюс foo будет более универсальной. это не меняйте return function() { return ++ numberOfCalls; } с остальным делайте, что хотите , var numberOfCalls = 0; не использовать |
Часовой пояс GMT +3, время: 12:33. |