Если я прочитал спецификации прямо, тогда let
, к счастью, также можно использовать, чтобы избежать самоназывающих функций, используемых для имитации только частных членов - популярного шаблона дизайна, который уменьшает читаемость кода, затрудняет отладку, что не добавляет реального кода защиты или другой пользы - за исключением, возможно, удовлетворения чьего-то желания семантики, поэтому прекратите ее использовать. / rant
var SomeConstructor;
{
let privateScope = {};
SomeConstructor = function SomeConstructor () {
this.someProperty = "foo";
privateScope.hiddenProperty = "bar";
}
SomeConstructor.prototype.showPublic = function () {
console.log(this.someProperty); // foo
}
SomeConstructor.prototype.showPrivate = function () {
console.log(privateScope.hiddenProperty); // bar
}
}
var myInstance = new SomeConstructor();
myInstance.showPublic();
myInstance.showPrivate();
console.log(privateScope.hiddenProperty); // error
См. « Эмуляция частных интерфейсов »
Это называется «имя введенного класса». Правило конкретно исходит от [temp.local]:
Как и обычные (не шаблонные) классы, у шаблонов классов есть имя-инъекции-класс (раздел 9) , Имя injected-class-name может использоваться как имя шаблона или имя . Когда он используется с template-argument-list , в качестве шаблона-аргумента для шаблона template-parameter или в качестве конечного идентификатора в спецификаторе специфицированного типа объявления шаблона класса друга, он относится к самому шаблону класса. В противном случае это эквивалентно имя-шаблона , за которым следуют шаблонные параметры шаблона класса, заключенного в
<>
.В рамках специализации шаблона класса или частичного специализация, когда имя injected-class-name используется как имя типа , оно эквивалентно имени шаблона , за которым следует template-arguments специализации шаблона класса или частичной специализации, заключенной в & lt;>. [Пример:
template<template<class> class T> class A { }; template<class T> class Y; template<> class Y<int> { Y* p; // meaning Y<int> Y<char>* q; // meaning Y<char> A<Y>* a; // meaning A<::Y> class B { template<class> friend class Y; // meaning ::Y }; };
-end example]
blockquote>Это в основном для удобства, так что имя класса внутри класса относится к самому классу, а не к внешнему, которое может иметь одно и то же имя. Для шаблонов классов это потенциально экономит много ввода, если у вас длинный список аргументов шаблона.