【问题标题】:What is the correct term for variable shadowing in JavaScript?JavaScript 中变量阴影的正确术语是什么?
【发布时间】:2011-07-19 09:35: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

是否有 de jure(ECMAScript 规范)或 de facto(通用)名称?遮遮掩掩?超载?

【问题讨论】:

    标签: javascript scope iife


    【解决方案1】:

    正确的词是[Variable] Shadowing

    在计算机编程中,变量遮蔽发生在某个范围(决策块、方法或内部类)内声明的变量与外部范围内声明的变量同名时。变量被称为阴影...

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

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

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

    编码愉快。

    【讨论】:

    • functions are the only way to introduce new scope in JavaScript 除了 withevalFunction(),它们都修改了作用域。
    • 在 ES6 中,if/for 块可以引入新的作用域,类也可以。无论如何,我认为“阴影”比“阴影”要好得多。相关的定义不是“投下阴影/变暗”,而是“跟随(在某人的影子中)”。
    【解决方案2】:

    如果它是偶然/错误发生的,你可以称它为 clobbering 原来的 parseInt()

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

    【讨论】:

    • +1 它只是 shadowing(这个词用在 C、Scala、Java 等中。不知道 Lisp 领域的术语是什么),虽然 clobbering 有时可能感觉更合适。它不是 重载
    • @pst 如果重新定义parseInt() :)
    • clobbering(“覆盖其内容”)意味着您在外部范围内更改了变量的值,所以我认为这在这种情况下没有意义。
    【解决方案3】:

    通常称为“阴影”。

    【讨论】:

      猜你喜欢
      • 2015-05-29
      • 2021-05-06
      • 2010-11-08
      • 2011-06-23
      • 2022-01-27
      • 2016-01-14
      • 2010-10-14
      • 2011-12-28
      相关资源
      最近更新 更多