Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Эффект статических переменных в функции (https://javascript.ru/forum/misc/36338-ehffekt-staticheskikh-peremennykh-v-funkcii.html)

jsjob 12.03.2013 15:21

Эффект статических переменных в функции
 
Как реализовать подобие статических (C, Pascal) переменных в функции?
Например - подсчёт числа вызовов самой функции.

rgl 12.03.2013 16:28

<html>

<head>
  <script type="text/javascript">
    var f = function() {
      var staticVar = 0;
      return function() {
        alert( "Function was called " + ++staticVar + " times" );
      }
    }();
  </script>
</head>

<body>
  <input type="button" value="+" onclick="f()">
</body>

</html>

jsgeek 12.03.2013 17:35

Можно и так:
function somefunc() {
    somefunc.n = somefunc.n ? somefunc.n + 1 : 1;
}
somefunc.n = 0; // чтобы не заморачиваться с  undefined

somefunc();
somefunc();
somefunc();
alert(somefunc.n); // => выведет 3

jsjob 12.03.2013 17:44

rgl, спасибо. Хотя в реальной ситуации, придётся писать целый объект со всеми операциями - изврат :-E

jsjob 12.03.2013 17:47

jsgeek, спасибо, это проще, хотя тоже непривычно после "нормальных" языков, и я так понимаю есть проблема с открытостью n для доступа из-вне функции.

jsgeek 12.03.2013 18:12

jsjob, функции в javascript являются объектами. К ним можно добавлять свойства и методы.
Пример:
function newfunc() {};
newfunc.x = 1;
newfunc.y = 2;
newfunc.someMethod = function () { return this.x + this.y }

Они будут доступны с объекта данной функции. Пример
newfunc.someMethod(); // => 3
newfunc.x = 10;
newfunc.y = 11;
newfunc.someMethod(); // => 21

Они доступны как для чтения так и для записи. Недоступными для записи их можно сделать с помощью замыканий или введенных в ECMAScript 5 атрибутов свойств.
Хотя с замыканием ничто не помешает сделать так:
newfunc.closure();
newfunc.closure = function() { 'Ха-ха. Я злобный хакер!'}

Это могут исправить атрибуты свойств, но они не доступны повсеместно

jsjob 12.03.2013 18:58

Спасибо.

Тему можно прикрыть, пока нет возможности досконально в этом разобраться.


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