Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.03.2013, 15:21
Аспирант
Отправить личное сообщение для jsjob Посмотреть профиль Найти все сообщения от jsjob
 
Регистрация: 30.01.2009
Сообщений: 42

Эффект статических переменных в функции
Как реализовать подобие статических (C, Pascal) переменных в функции?
Например - подсчёт числа вызовов самой функции.
Ответить с цитированием
  #2 (permalink)  
Старый 12.03.2013, 16:28
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

<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>
Ответить с цитированием
  #3 (permalink)  
Старый 12.03.2013, 17:35
Аспирант
Отправить личное сообщение для jsgeek Посмотреть профиль Найти все сообщения от jsgeek
 
Регистрация: 13.02.2013
Сообщений: 34

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

somefunc();
somefunc();
somefunc();
alert(somefunc.n); // => выведет 3
Ответить с цитированием
  #4 (permalink)  
Старый 12.03.2013, 17:44
Аспирант
Отправить личное сообщение для jsjob Посмотреть профиль Найти все сообщения от jsjob
 
Регистрация: 30.01.2009
Сообщений: 42

rgl, спасибо. Хотя в реальной ситуации, придётся писать целый объект со всеми операциями - изврат
Ответить с цитированием
  #5 (permalink)  
Старый 12.03.2013, 17:47
Аспирант
Отправить личное сообщение для jsjob Посмотреть профиль Найти все сообщения от jsjob
 
Регистрация: 30.01.2009
Сообщений: 42

jsgeek, спасибо, это проще, хотя тоже непривычно после "нормальных" языков, и я так понимаю есть проблема с открытостью n для доступа из-вне функции.
Ответить с цитированием
  #6 (permalink)  
Старый 12.03.2013, 18:12
Аспирант
Отправить личное сообщение для jsgeek Посмотреть профиль Найти все сообщения от jsgeek
 
Регистрация: 13.02.2013
Сообщений: 34

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() { 'Ха-ха. Я злобный хакер!'}

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

Последний раз редактировалось jsgeek, 12.03.2013 в 18:23.
Ответить с цитированием
  #7 (permalink)  
Старый 12.03.2013, 18:58
Аспирант
Отправить личное сообщение для jsjob Посмотреть профиль Найти все сообщения от jsjob
 
Регистрация: 30.01.2009
Сообщений: 42

Спасибо.

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
динамическое содержимое функции alfmaster Общие вопросы Javascript 2 28.05.2011 17:10
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03