下面我们有一个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规范)或事实(普通)名称?掩盖?超载?
解决方法:
正确的术语是[Variable] Shadowing
In computer programming, variable shadowing occurs when a variable declared within a certain scope (decision block, method, or inner class) has the same name as a variable declared in an outer scope. This outer variable is said to be shadowed…
JavaScript中的函数只是存储在变量(或属性)中的函数对象,这些变量遵循与正常变量(或属性)相同的范围链/解析规则.这解释了原因仍可以作为window.parseInt访问的原因.引入这个新范围的是“IIFE”(函数是在JavaScript中引入新范围的唯一方法).
但是,ECMAScript Specification [5th Edition]不使用阴影这个术语,也不能找到特定的替换术语. (基本的阴影行为在“10.2.2.1 GetIdentifierReference”和相关章节中定义.)
它没有超载,也没有超越,这完全不同.我不知道在哪里黯然失色(在这种情况下)起源或者它应该如何与“正常”[变量]阴影区别开来.如果不存在阴影这个词来解释这种行为那么 – 从英语语言的角度来看 – 无论如何 – 黯然失色(“使微不足道/无关紧要”)可能比阴影(“阴影投射/变暗”更合适) .
快乐的编码.