Почему закрытия Javascript называются безопасными - PullRequest
7 голосов
/ 14 февраля 2011

В одном из своих видеороликов (около 1 минуты 25 секунд. Часы в видео идут назад, поэтому они равны -27: 45), Дуглас Крокфорд упоминает, что закрытия Javascript являются источником огромных выразительная сила и в отличие от других силовых конструкций также безопасны. Он особо упоминает, что в Javascript замыкание ограничивает область действия, что делает их более безопасными.

Может кто-нибудь помочь мне с несколькими примерами, которые показывают, как правила области видимости закрытий Javascript делают их более безопасными, чем другие языки, которые имеют замыкания. Также есть ли другие вещи, которые делают Javascript-замки более безопасными, чем их аналоги на других языках?

Ответы [ 2 ]

9 голосов
/ 14 февраля 2011

Они «безопасны» в том смысле, что только код в лексической области действия замыкания может напрямую получать доступ к переменным области действия замыкания. Я рекомендую прочитать Замечания по закрытию Jibbering , в целом.

Любой «протекший» объект может по-прежнему вводить точку манипулирования данными / побочного эффекта. Замыкания в ECMAScript не более «безопасны», чем в любом другом языке с аналогичной семантикой замыканий - в этом смысле «безопасный» означает «доступ к частной переменной». С другой стороны, некоторые языки уже имеют более контролируемые модификаторы видимости членов (например, Java или C # с частными / открытыми различиями).

Это, конечно, если считать объекты JavaScript, которые "просто" полагаются на прототипы, "небезопасными". (Если кто-то использует мой код неправильно, пусть он - а если он сломается, пусть он сгорит; -)

Лично я нахожу мистера Крокфорда хорошим евангелистом, но не для моей религии ;-) Можно сказать о X все хорошее, не анализируя его по отношению к Y.

3 голосов
/ 14 февраля 2011

Замыкания дают вам возможность инкапсулировать (скрывать) данные, что желательно для объектно-ориентированного проектирования.

Возможность эффективно определять «частные» переменные и публиковать «общедоступный» интерфейс снижает вероятность того, что программист будет неправильно использовать объект - т. Е. Напрямую связываться со значением данных и давать неожиданные побочные эффекты.

// returns an object that does not itself possess "var a"
// The closure gives indirect access to a, via the public getter and setter.
function f() {
   var a = 1;

   return {
      getA: function() {
         return a;
      },
      setA: function( A ) {
         a = A;
      }
   };
}

var MyObj = new f();

alert(MyObj.a); // --> undefined
alert(MyObj.getA()); // --> 1

MyObj.setA(5);
alert(MyObj.getA()); // --> 5

ПРИМЕР

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