В чем разница между частной и публичной функциями? - PullRequest
2 голосов
/ 15 апреля 2010

Я новый программист, я начал в C и теперь начинаю наслаждаться JavaScript и чуть-чуть PHP. В последнее время я много слышал термины «частные» и «публичные». Может ли кто-нибудь дать объяснение обоим и как они полезны для программиста?

И я, наверное, совершенно не прав здесь ... но это

(function(){}) 

в javascript частной функции?

1 Ответ

11 голосов
/ 16 апреля 2010

Термины «публичный» и «частный» не совсем подходят для Javascript. Ключ заключается в следующем: у вас есть способ обратиться к какой-либо функции, вы знаете, чтобы существовать? То есть вы можете ссылаться на него по имени (напрямую или как свойство другого объекта, на который вы можете ссылаться)? Если это так, поздравляю, вы можете вызвать функцию. Если нет, то вы не можете.

Это означает, что «публичность» функции не является статичной, как в Java или C. Рассмотрим:

var x = (function() {
  function maybePrivate() { return "my privates!"; }

  return {
    getMyPrivates: function() {
      var rv = maybePrivate;
      this.getMyPrivates = function() { return null; };
      return rv;
    }
  };
})();

Weird. Итак, теперь «x» - это объект, и вы можете видеть, что там есть функция «MaybePrivate». Однако это имя & ndash; "MaybePrivate" & mdash; не приносит вам никакой пользы, потому что с снаружи x вы не можете использовать имя для доступа к функции.

Однако этот странный объект имеет другую функцию, называемую "getMyPrivates", и вы можете добраться до нее. Когда вы вызываете его, вы получаете ссылку на функцию "MaybePrivate", которую затем можете использовать для вызова этой функции. Теперь, может быть, «PrivatePrivate» по-прежнему является частным? Хорошо, если вы сделаете это:

alert(x.getMyPrivates()());

вы увидите "мои рядовые!" сообщение. Так что, похоже, «MaybePrivate» больше не так уж приватен. Однако, если вы попробуете это еще раз , это не сработает, потому что getMyPrivates упорядочивает для себя вывод из памяти после первого вызова.

Смысл этого маленького путешествия через зеркало - показать, что Javascript динамичен. Единственное, что действительно «статично», - это то, что после того, как вы запечатали функцию внутри замыкания (как, например, «MaybePrivate» в приведенном выше примере), вы не можете заставить ее открыться с снаружи объект (по крайней мере, не без каких-либо извращенных искажений; язык настолько мягкий, что опасно утверждать, что что-то «невозможно» :-). Этот объект в этом примере может показать свои «личные» вещи, но он также может не делать этого.

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