当前位置: 首页 > 面试题库 >

JavaScript中的可变阴影

梁学真
2023-03-14
问题内容

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


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 以下代码生成编译错误:“已声明并未使用err”。如果这里存在范围/阴影问题,那是由于我不了解的原理。有人可以解释吗? 问题答案: 这不是因为有任何阴影。除了为变量赋值之外,您没有使用任何声明的变量。 根据常见问题 未使用的变量的存在可能表明存在错误,而未使用的导入只会减慢编译速度。在代码树中积累足够的未使用导入,事情可能会变得很慢。由于这些原因,Go不允许 如果声明变量,则必须使用 在

  • 问题内容: 我对此Java代码有一些疑问。它给出的输出是“ furry bray”。我的问题: 为什么我得到此输出? 我如何访问ZooKeeper类中的字符串对象引用“名称”? 如果它与变量屏蔽有关,那么哪个变量正在被屏蔽? 码: 问题答案: 变量不是多态的。当您访问时,无论对象的执行时间类型如何,它都将 始终 使用属于该对象的字段。如果需要访问,则需要一个 编译时 类型为的表达式。 该方法实际上

  • 问题内容: 这是来自GOPL的示例-“表达式x [i]和x +’A’-‘a’分别引用外部块中x的声明;我们稍后将对此进行解释。” 解释永远不会到来。为什么x [i]引用外部范围中的x?只要在内部块中重新声明x,它就应该在外部块中遮盖x。为什么这样做? http://play.golang.org/p/NQxfkTeGzA 问题答案: 运算符创建一个新变量,并为其分配右侧值。 在for循环的第一个迭

  • 问题内容: 我知道在PHP中可能有“变量”变量。例如 是否可以在JavaScript中将变量的名称引用为字符串?怎么做? 问题答案: 对此没有单一的解决方案(当然,有,但是请不要认真考虑)。可以通过来动态访问 一些 全局变量,但这不适用于函数本地的变量。 不会 成为属性的全局变量是使用和和定义的变量。 几乎总是比使用可变变量更好的解决方案! 相反,您应该查看数据结构并为您的问题选择正确的结构]。

  • 阴影 Unity 的灯光可以将 阴影 从一个游戏对象投射到自身的其他部分或是附近的其他游戏对象上。阴影以『扁平』的方式体现游戏对象的尺寸和位置,因此可以为场景添加一定程度的深度和真实感。 场景视图中的游戏对象正在投射阴影 阴影如何工作? 考虑一种最简单的情况,在场景中只有单个光源。光线从光源出发并沿着直线传播,最终可能会碰撞到场景中的游戏对象。一旦光线碰撞到某个游戏对象,光线将无法继续传播和照亮前

  • 问题内容: 我希望这个问题不是太简单,但是我不知道:( 如何在函数名称中使用var启动函数? 例如 … 我的职能 启动功能 我希望有人能帮助我。 提前致谢!彼得 问题答案: 将函数存储在一个对象中,而不是使其成为顶层。 然后,您可以像访问其他任何对象一样访问它们: 您也可以直接从对象访问它们… ……并避免将它们存储在一个对象中,但这意味着应该在全局范围内进行播放。