Затенение переменных в JavaScript - PullRequest
26 голосов
/ 21 марта 2011

Ниже у нас есть IIFE , который (как и любая функция) создает локальную область. Внутри этой области есть функция parseInt. Теперь, поскольку в браузере уже есть глобальная функция с таким именем, локальная функция будет затенять глобальную функцию parseInt - внутри IIFE любой вызов parseInt будет вызывать локальную функцию, а не глобальную. (На глобальную функцию все еще можно ссылаться с помощью window.parseInt.)

parseInt('123', 10); // the browser function is called

(function() {

    function parseInt() { return 'overshadowed'; }

    parseInt('123', 10); // the local function is called

})();

parseInt('123', 10); // the browser function is called

Существует ли де-юре (спецификация ECMAScript) или де-факто (обычное) имя для этого? Затмив? Перегрузки?

Ответы [ 3 ]

37 голосов
/ 21 марта 2011

Правильный термин [Переменная] Затенение

В компьютерном программировании теневое копирование переменной происходит, когда переменная, объявленная в определенной области (блок решений, метод или внутренний класс), имеет то же имя, что и переменная, объявленная во внешней области. Эта внешняя переменная Говорят, что в тени ...

Функции в JavaScript - это просто функциональные объекты, хранящиеся в переменных (или свойствах), которые подчиняются тем же правилам области действия / разрешения, что и обычные переменные (или свойства) . Это объясняет, почему к оригиналу все еще можно получить доступ как window.parseInt. Именно «IIFE» представляет эту новую область (функции - единственный способ ввести новую область в JavaScript).

Однако в спецификации ECMAScript [5-е издание] не используется термин shadowing , и при этом я не могу найти конкретный термин для замены. (Фундаментальное поведение shadowing определено в «10.2.2.1 GetIdentifierReference» и связанных с ним разделах.)

Это не с перегрузкой и не с перегрузкой , которые совершенно разные. Я понятия не имею, откуда взялась overshadowing (в этом контексте) или как она должна отличаться от "нормальной" [variable] shadowing . Если бы термин shadowing еще не существовал для объяснения этого поведения, тогда - с точки зрения английского языка в любом случае - overshadowing («сделать незначительным / несущественным») может быть более подходящим чем затенение («бросить тень на / затемнить»).

Удачного кодирования.

10 голосов
/ 21 марта 2011

Если бы это произошло случайно / по ошибке, вы бы назвали это удушье оригинал parseInt().

В противном случае, я думаю, я видел, что это упоминается теней недавно здесь, на переполнении стека.

4 голосов
/ 21 марта 2011

Чаще всего называется "затенение".

...