JavaScript中的变量阴影

时间:2011-03-21 02:35:36

标签: javascript scope iife

下面我们有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

是否有 de jure (ECMAScript规范)或事实上的(常见)名称?掩盖?超载?

3 个答案:

答案 0 :(得分:37)

正确的字词是[Variable] Shadowing

  
    

在计算机编程中,当在特定范围内声明的变量(决策块,方法或内部类)与在外部范围内声明的变量具有相同的名称时,会发生变量阴影。此外部据说变量被遮蔽......

  

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

但是,ECMAScript Specification [5th Edition]不使用术语 shadowing ,也无法找到特定的替换术语。 (基本的阴影行为在“10.2.2.1 GetIdentifierReference”及相关章节中定义。)

重载 覆盖,这完全不同。我不知道黯然失色(在此上下文中)源自哪里或者它应该如何与“正常” [变量]阴影不同。如果 shadowing 一词尚不存在以解释这种行为,那么 - 无论如何从英语语言的观点来看 - 黯然失色(“使得无关紧要/无关紧要”)可能是比 shadowing 更适合(“将阴影投射到/变暗”)。

快乐的编码。

答案 1 :(得分:10)

如果是偶然/错误发生的,您可以将其称为clobbering原始parseInt()

否则,我相信我最近在Stack Overflow上看到它引用了 shadowing

答案 2 :(得分:4)

通常称为“阴影”。