gpt4 book ai didi

javascript - 为什么 const 在 if() 或 try{}catch(e){} 中多次运行代码时会抛出错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:59 26 4
gpt4 key购买 nike

我正在尝试使用 const 声明一组常量。我的问题是在 Firebug 控制台中测试代码会引发错误,提示“重新声明 const foo”。

我尝试将它包装在 try{}catch(e){} block 中,但这没有帮助,甚至在尝试使用以下代码绕过它时(减号发布)所有的 console.info() “调试”要求清晰)它在第二次运行时仍然抛出错误:

if(!chk_constsDeclaredYet) {
var chk_constsDeclaredYet = true;
const foo="bar";
}

我的问题是,虽然 const 在 if(){} 中,但当代码第二次“运行”时,为什么还要查看 const foo?

注意:代码将在 firebug javascript 控制台中运行,我试图实现的工作流程是:

  1. 将代码粘贴到 Firebug 控制台
  2. 点击运行(创建常量)
  3. 我在不重新加载页面的情况下对控制台中的代码进行了编辑(常量仍然在页面上下文中定义)
  4. 再次点击运行(使用 if(){} 以避免重新声明常量,如果它们已经在上一次运行中声明过的话)
  5. 从 (3) 开始重复

Firebug 输出:

//FIRST RUN::
>>> console.group() console.info('--code start--'); ...console.info('--code end--'); console.groupEnd()
--code start--
chk_constsDeclaredYet = undefined
foo = undefined
--if()--
--if() running..--
--end if()--
chk_constsDeclaredYet = true
foo = bar
--code end--

//SECOND RUN::
>>> console.group() console.info('--code start--'); ...console.info('--code end--'); console.groupEnd()
TypeError: redeclaration of const foo { message="redeclaration of const foo", more...}

最佳答案

这是一个古老的答案。我写了一个slightly newer answer处理类似的“const 重新分配/作用域”问题,其中我显示产生的错误(如果有的话)因执行方法浏览器而异。

由于 const(不是 ECMAScript 第五版标准的一部分)在 ECMAScript 第六版中具有不同的含义,我建议在当前版本中避免使用它代码。


const,如 var 是“函数作用域”。我怀疑问题是由 binding 上与 var 发生的相同类型的“函数顶部”提升引起的(这解释了为什么异常不是来自赋值而是来自声明)。也就是说,任何后续的 const x = ...无论它们出现在哪里,都被认为是无效的,因为先前的声明已经存在(根据定义,只能有 < em>每个作用域一个给定名称的常量)。但是,const 可以取任何值,因此 赋值 发生在 const x = ... 站点,就像赋值发生在var x = ... 站点,即使注释/绑定(bind)被提升到范围的顶部。

这是一个简单的测试用例,可以更清楚地说明问题:

function x () { if (true) { const a = 1 } else { const a = 2 }}
// => TypeError: redeclaration of const a @ <x-jsd:interactive-session

如您所见,错误发生在函数声明处发生在函数执行时。这就是 try/catch 不起作用的原因。行为也可能受到您正在处理的交互式工具的影响,具体取决于它如何执行代码(例如,每次都是相同的执行上下文?)。

然而,这很好用并强化了上面的初始命题:

(function x() { if (false) { const c = 1 }; return c })()
// => undefined

来自 https://developer.mozilla.org/en/JavaScript/Reference/Statements/const

(添加了粗体强调)

Creates a constant that can be global or local to the function in which it is declared. Constants follow the same scope rules as variables.

The value of a constant cannot change through re-assignment, and a constant cannot be re-declared. Because of this, although it is possible to declare a constant without initializing it, it would be useless to do so.

A constant cannot share its name with a function or a variable in the same scope.

const is a Mozilla-specific extension, it is not supported by IE, but has been partially supported by Opera since version 9.0 and Safari.

关于javascript - 为什么 const 在 if() 或 try{}catch(e){} 中多次运行代码时会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4158416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com