JavaScript中的可变阴影

问题描述:

下面我们有一个IIFE它(与任何函数一样)创建一个本地作用域。在该范围内有一个parseInt函数。现在,由于在该浏览器中已经有了这个名称的全局函数,本地函数将遮蔽全局的parseInt函数 - 在IIFE内部,任何对parseInt的调用都将调用本地函数,而不是全局函数。 (全局函数仍然可以window.parseInt引用。)JavaScript中的可变阴影

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

在计算机程序中,当在一定的范围(判定框,方法或内部类)内声明的变量具有相同的名称作为一个变量出现可变遮蔽在外部范围内声明。在JavaScript该外变量被说成是阴影...

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

但是,ECMAScript Specification [5th Edition]不使用术语阴影,我也不能找到具体的替代术语。 (基本遮蔽行为在“10.2.2.1 GetIdentifierReference”及相关部分所定义。)

超载,这是不重写,它们是完全不同的。我不知道哪里黯然失色(在这方面)起源或它应该如何不同于“正常”[变量] shadowing。如果遮蔽尚未存在来解释这种行为,那么长期- 从英语角度看无论如何 - 掩盖(“做出猥琐/无关紧要”)可能比阴影更合适(“投阴影/变暗“)。

快乐编码。

+0

'函数是引入JavaScript范围内新范围的唯一方法,除*带*,* eval *和* Function()*外,它们都修改范围。 – RobG 2011-11-24 05:51:09

+0

在ES6中,如果/ for块可以引入新的作用域,就像类一样。无论如何,我认为“影子”比“阴影”要好得多。相关定义不是“投下阴影/变暗”,而是“追随(在某人的影子下)”。 – 2016-09-24 05:35:28

如果发生意外/错误,您可以将它称为clobbering原始parseInt()

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

+1

+1它只是* shadowing *(术语用于C,Scala,Java等)不知道Lisp-land中的术语是什么),尽管* clobbering *有时可能会感觉更合适。它它**而不是** *重载*。 – 2011-03-21 04:36:40

+0

@pst我会说绝对如果重新定义'parseInt()':) – alex 2011-03-21 04:39:59

+0

clobbering(“覆盖其内容”)将意味着你改变了外部范围内的变量的值,所以我不认为这是有道理的在这方面。 – codemagician 2017-09-22 12:06:24

更常称为“阴影”。