如果我们声明一个变量和一个同名的函数,它接受重新声明。但是当我们在一个块内做同样的事情时,它显示重新声明错误.
Code:
var x;
function x() {}; // no error.
但在这种情况下我收到错误。
{
var inside; // re-declaration error.
function inside() {};
}
预期结果应该没有错误。
这是 EcmaScript 6 的更改。从 ES6 开始,不再允许有重复的绑定在块范围内.
The ES5 spec没有这样的限制,但在ES6 spec语义已更改:
13.2.1 静态语义:早期错误
Block : { 声明列表 }
第一部分是相关的 -LexicallyDeclaredNames
包含块内代码中找到的所有声明。
据推测,这是 ES6 中函数声明语义变化的一部分,因为现在它们可以是块作用域的:
{ //block 1
function foo() { // declared in block 1
return 1;
}
console.log("block 1: foo() === 1", foo() === 1);
{ // block 2
function foo() { // declared in block 2
return 2;
}
console.log("block 2: foo() === 2", foo() === 2);
}
console.log("block 1: foo() === 1", foo() === 1);
}
这是等效 ES5 代码的语法糖:
(function() { //block 1
var foo = function() {
return 1;
}
console.log("block 1: foo() === 1", foo() === 1);
(function() { //block 2
var foo = function() {
return 2;
}
console.log("block 2: foo() === 2", foo() === 2);
})();
console.log("block 1: foo() === 1", foo() === 1);
})();
但是,此功能无法处理重复的名称。
对于任何块,包括其他类型的块语句,都存在相同的行为。这是一个例子:
{ //block
function foo() { return 1; }
console.log("block: foo() === 1", foo() === 1);
if (true) { // if block
function foo() { return 2; }
console.log("if block: foo() === 2", foo() === 2);
}
for (var i = 0; i < 1; i++) { // for block
function foo() { return 3; }
console.log("for block: foo() === 3", foo() === 3);
}
switch ("hello world") { // case block
default:
function foo() { return 4; }
console.log("case block: foo() === 4", foo() === 4);
}
console.log("block: foo() === 1", foo() === 1);
}
但需要注意的是,同一内容的重复声明type (var
or function
)不会导致错误:
{
var foo = 1;
var foo = 2;
console.log("foo ->", foo);
}
{
function bar() { return "a"; }
function bar() { return "b"; }
console.log("bar() ->", bar());
}
所以,他们似乎没有被视为不同的声明,但覆盖相同的词法声明名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)