Затенение переменных в JavaScript

ниже есть жизнь который (как и любая функция) создает локальную область. Внутри этой области есть . Теперь, поскольку в браузере уже есть глобальная функция с этим именем, локальная функция затмит глобальную 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

есть de юре!--11--> (спецификация ECMAScript) или де-факто (общей) имя? Осенение? Перегрузка?

3 ответов


правильный термин -[Переменная] Тенизации

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

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

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

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

удачи в кодировании.


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

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


чаще называют "затенением".