Насколько защищены слова private и public в JavaScript - PullRequest
8 голосов
/ 23 июня 2011

Каждый раз, когда я собираю библиотеку JS, у меня возникает такая концепция:

(function(window,undefined){
  var LibName = function(){
    var privateAPI = {
      method: function(){}
    };
    var publicAPI = {
      publicMethod: function(){}
    };
    return publicAPI;
  }
  window.LibName = LibName;
})();

Но я всегда мечтал просто сделать:

(function(window,undefined){
  var LibName = function(){
    var private = {
      method: function(){}
    };
    var public = {
      publicMethod: function(){}
    };
    return public;
  }
  window.LibName = LibName;
})();

Но я никогда этого не делал, потому что это зарезервированные слова. Насколько они защищены? Будет ли сбой браузера? В моем тестировании все работает, но я что-то упустил?

Ответы [ 4 ]

14 голосов
/ 23 июня 2011

Всегда предполагайте, что неправильное использование зарезервированных слов приведет к сбою приложения.

Такие слова, как public и private, являются зарезервированными в будущем словами , поэтому, даже если они работают сейчас, это может произойти не в будущем.

7 голосов
/ 23 июня 2011

https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words

и

http://www.ecma -international.org / публикации / файлы / ECMA-ST / ECMA-262.pdf для официальной спецификации.

Они перечислены в 7.6.1.2 как "зарезервированные для будущего использования".

2 голосов
/ 22 июня 2012

Я бы не рекомендовал использовать приватные и публичные. Но вы получите ошибку только при использовании строгого режима со словом «использовать строгий»: https://developer.mozilla.org/en/JavaScript/Strict_mode

Если вы хотите быть уверенным, это сработает в будущем, вам придется использовать круглые скобки:

this["private"] = {
  method: function() {}
}

Я предпочитаю сокращать var до "pub" и "priv". Поэтому я использую такой шаблон:

namespace.decorator = function (pub, priv) {
  pub = pub || {};
  priv = priv || {};
  //namespace.decoratorToExtend(pub, priv);
  pub.method = function() {alert(pub.prop)};
  return pub;
}
var instance = namespace.decorator({prop:'hello world'});
instance.method();
0 голосов
/ 23 июня 2011

Из того, что я испытал с зарезервированными словами в javascript, код выдаст ошибку, похожую на синтаксическую ошибку.

...