JavaScript 中变量阴影的正确术语是什么?

IT技术 javascript scope iife
2021-01-21 08:42:59

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

3个回答

正确的术语是[Variable] Shadowing

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

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

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

超载,它是不是 压倒一切,这是完全不同的。我不知道overshadowing(在这种情况下)起源于哪里,也不知道它与“正常” [variable] shadowing有何不同如果术语阴影不存在来解释这种行为,那么——无论如何,从英语的角度来看——遮蔽(“使无关紧要/无关紧要”)可能比阴影(“将阴影投射/变暗”)更合适.

快乐编码。

functions are the only way to introduce new scope in JavaScript除了withevalFunction(),它们都修改作用域。
2021-03-14 08:42:59
在 ES6 中,if/for 块可以引入新的作用域,类也是如此。无论如何,我认为“阴影”比“阴影”好(很多)。相关的定义不是“投下阴影/变暗”,而是“跟随(在某人的阴影下)”。
2021-03-17 08:42:59

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

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

clobbering(“覆盖其内容”)意味着您在外部范围内更改了变量的值,因此我认为在这种情况下这没有意义。
2021-04-01 08:42:59
+1 这只是影子(术语用于 C、Scala、Java 等。不知道 Lisp-land 中的术语是什么),尽管有时clobbering可能感觉更合适。不会 超载
2021-04-03 08:42:59
@pst 如果重新定义,我肯定会说parseInt():)
2021-04-11 08:42:59

通常称为“阴影”。