一尘不染

JavaScript中的可变阴影

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规范)或 事实上的 (通用的)名称?遮盖?超载?


阅读 356

收藏
2020-05-01

共1个答案

一尘不染

正确的术语是[可变]阴影

在计算机编程中, 当在某个范围(决策块,方法或内部类)中声明的变量与在外部范围中声明的变量具有相同的名称时将发生变量阴影。
据说这个外部变量被遮盖了…

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

但是,[ECMAScript规范第5版并未使用“ 阴影”一词,也找不到特定的替代术语。(基本的 屏蔽 行为在“ 10.2.2.1 GetIdentifierReference”和相关部分中定义。)

超载 ,它是 不是 压倒一切 ,这是完全不同的。我不知道(在这种情况下) 阴影 从何而来,或者与“正常”
[可变]阴影 有何不同。如果尚不存在 阴影 这个术语来解释这种行为,那么-无论如何从英语角度来看- 阴影 (“使无关紧要/无关紧要”)比
阴影 (“将阴影蒙上/变暗”)更合适。。

2020-05-01