26

下面我们有一个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 规范)或事实上的(通用)名称吗?遮遮掩掩?超载?

4

3 回答 3

37

正确的术语是[Variable] Shadowing

在计算机编程中,当在某个范围(决策块、方法或内部类)中声明的变量与在外部范围中声明的变量具有相同的名称时,就会发生变量隐藏。据说这个外部变量被遮蔽了......

JavaScript 中的函数只是存储在变量(或属性)中的函数对象,这些变量(或属性)遵循与普通变量(或属性)相同的作用域链/解析规则。这解释了为什么仍然可以访问原始文件window.parseInt。正是“IIFE”引入了这个新的作用域(函数是在 JavaScript 中引入新作用域的唯一方法)。

但是,ECMAScript 规范 [第 5 版]没有使用术语阴影,我也找不到特定的替代术语。(基本的阴影行为在“10.2.2.1 GetIdentifierReference”和相关章节中定义。)

不是 重载也不是 覆盖,它们是完全不同的。我不知道阴影(在这种情况下)起源于哪里,也不知道它应该如何与“正常” [变量]阴影不同。如果不存在术语阴影来解释这种行为,那么 - 从英语的角度来看 -阴影(“使无关紧要/无关紧要”)可能比阴影(“在/上投射阴影”)更合适.

快乐编码。

于 2011-03-21T04:45:33.387 回答
10

如果它是偶然/错误发生的,你会称之为破坏原始parseInt().

否则,我相信我最近在 Stack Overflow 上看到它提到了阴影。

于 2011-03-21T02:48:42.503 回答
4

更通常称为“阴影”。

于 2011-03-21T02:48:48.907 回答