kwa*_*wah 3 javascript firebug const constants
我正在尝试使用声明一堆常量const。我的问题是,在Firebug控制台中测试代码会引发错误,抱怨“ const foo的重新声明”。
我尝试将其包装在一个 try{}catch(e){}块中,但这无济于事,即使尝试使用以下代码来解决它(张贴减去所有console.info()“调试”的调用以求清楚),它仍然会引发错误第二次运行时:
if(!chk_constsDeclaredYet) {
var chk_constsDeclaredYet = true;
const foo="bar";
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当const位于if(){}中时,当第二次运行代码时,为什么还要查看const foo?
注意:代码将在firebug javascript控制台中运行,而我想要实现的工作流程是:
萤火虫输出:
//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...}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是一个古老的答案。我写了一个较新的答案,处理类似的“常量重新分配/作用域”问题,在该问题中,我发现所产生的错误(如果存在)会因执行方法和浏览器而异。
由于const(这不是ECMAScript 5th版标准的一部分)在ECMAScript 6th版中具有不同的含义,因此我建议在当前代码中避免使用它。
const,例如var“功能范围”。我怀疑问题是由与绑定发生的相同的“功能至上”提升引起的var(这解释了为什么异常不是来自赋值而是来自声明)。也就是说,任何后续的const x = ...(无论出现在何处)都被视为无效,因为先前的声明已经存在(根据定义,每个作用域只能有一个具有给定名称的const)。然而,const可以采取任何值,因此分配发生在const x = ...现场,就像分配发生在var x = ...现场,即使标注/结合升任范围的顶部。
这是一个简单的测试用例,可以更清楚地说明问题:
function x () { if (true) { const a = 1 } else { const a = 2 }}
// => TypeError: redeclaration of const a @ <x-jsd:interactive-session
Run Code Online (Sandbox Code Playgroud)
如您所见,错误发生在函数声明而不是函数执行时。这就是为什么try / catch不起作用的原因。该行为也可能会受到所使用的交互工具的影响,这取决于该交互工具如何执行代码(例如,每次都具有相同的执行上下文吗?)。
但是,这很好用,并加强了上面的初始主张:
(function x() { if (false) { const c = 1 }; return c })()
// => undefined
Run Code Online (Sandbox Code Playgroud)
来自https://developer.mozilla.org/en/JavaScript/Reference/Statements/const
(添加了粗体字)
创建一个常量,该常量对于声明它的函数可以是全局的或局部的。常量遵循与变量相同的作用域规则。
常量的值不能通过重新分配而更改,并且常量也不能重新声明。因此,尽管可以在不初始化的情况下声明常量,但这样做是没有用的。
常量不能与同一范围内的函数或变量共享其名称。
const是Mozilla专有的扩展,IE不支持它,但是自9.0版和Safari版本以来,Opera已部分支持它。