функции JavaScript являются объектами? - PullRequest
10 голосов
/ 01 марта 2011

Я уже некоторое время бьюсь над вопросом Javascript, и мне не удалось найти объяснения в Интернете.Я думаю, это потому, что я не ввожу правильные ключевые слова, которые также могут быть связаны с тем, почему я вообще с этим борюсь.

Мое основное предположение состоит в том, что можно изменять объекты:

> var x = {'n': 2};
> x['n']
2
> x['n'] = 3;
3

Pheww, который работал.Но все же (функции тоже объекты):

> var addn = function(a) {
    var n = 2;
    return n + a;
}

> addn(3);
5
> addn['n'] = 3;
3
> addn(3);
5

На этот раз я не смог изменить 'n'.Есть ли способ исправить это, сохранив функциональный вкус?В отличие от того, чтобы идти полностью ОО.Смежный вопрос, который у меня есть, заключается в том, как сохранить зависимости функций с целью, например, тестирования - опять же без OO?Конечно, я ищу решение, но, если возможно, я также хотел бы понять, какой механизм в Javascript заставляет меня бороться.

Cheers,

Mark

Отказ от ответственности: упоминаниемОО Я не собираюсь ничего говорить против ОО.И я не собираюсь ничего говорить против VI или Emacs.Если я как-то обидел ваши чувства, пожалуйста, пропустите это.

Ответы [ 7 ]

16 голосов
/ 01 марта 2011

Закрытые переменные в области видимости функции и свойство объекта - это 2 очень разные вещи. var n внутри этой функции полностью недоступен извне этой функции.

Таким образом, после выполнения этого кода addn.n == 3, но другое значение, установленное на var n, инициализируется при каждом запуске функции. Из-за особенностей javascript, функция не может действительно легко получить доступ к своим собственным свойствам. Вместо этого этот шаблон будет лучше достигнут путем передачи аргумента function(n, a)

Или используйте объект для достижения чего-то похожего.

var adder = {
  n: 0,
  addn: function(a) {
    return this.n + a;
  }
};

adder.n = 5;
adder.addn(2); // 7
6 голосов
/ 01 марта 2011

Если я правильно понимаю ваш вопрос, вы можете дать имя своей анонимной функции и получить доступ к свойствам объекта функции через это:

var addn = function func(a) {
  return func.n + a;
};

addn['n'] = 3;
addn(3); // returns 6
2 голосов
/ 01 марта 2011

Свойства объекта и локальные переменные в значительной степени не связаны:

  • var n объявляет переменную, которая ограничен функцией, в которой он находится (т.е. снаружи это не видно функция (кроме замыкания)).

  • addn['n'] добавляет свойство с именем n до addn и эквивалентно addn.n

1 голос
/ 01 марта 2011

Лучше полностью забыть о традиционной ОО-концепции «объектов» в Javascript-стране и вместо этого думать о терминах замыканий.Я настоятельно рекомендую прочитать этот урок Джона Резига, создателя jQuery.

1 голос
/ 01 марта 2011

Поскольку JavaScript имеет область действия функции, вы можете использовать функцию для хранения значения n следующим образом:

var addn = (function(n) {
  return function(x) {
    n += x;
    return n;
  }
}(2);

addn(3) // 5
addn(3) // 8
0 голосов
/ 04 июня 2015

Во-первых, вы не изменяете переменную функции, выполняя это:

addn ['n'] = 3;

У определенной вами функции нетлюбое имя (также известное как «анонимная функция»).Вы просто присваиваете эту функцию переменной addn.Переменная не имеет никакого свойства - это просто контейнер (если переменная не ссылается на массив).Так что addn['n'] ничего не возвращает.

Как отметил пользователь casablanca, вы можете назвать свою функцию как func, а затем получить доступ (и изменить) ее свойства как func.<propertyname>.

0 голосов
/ 01 марта 2011

По сути, все в Javascript - это объект.Если бы вы сказали, что

var a=3;
a['n']=4;

ссылки на 'a' все равно вернут 3, но a также имеет член 'n' со значением 4. Поэтому, когда вы говорите addn['n'] = 3, вы добавляете нового члена вдобавить, и никак не повлиять на функцию.

Я настоятельно рекомендую прочитать Как хорошие привычки c могут способствовать плохим привычкам javascript. При описании всего, что вы можете делать неправильно, это здорововведение в работу объектов в Javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...