Подтвердить что ты не робот

Переменная затенение в JavaScript

Ниже мы имеем 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) или де-факто (общее) имя? Затмив? Перегрузки?

4b9b3361

Ответ 1

Правильный термин [Variable] Shadowing

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

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

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

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

Счастливое кодирование.

Ответ 2

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

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

Ответ 3

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