为什么 var 允许重复声明,而 const 和 let 却不允许重复声明?
Why does var allow duplicate declaration but why does const and let not allow duplicate declaration?
为什么var允许重复声明,但为什么const和let不允许重复声明?
var
允许重复声明
xx=1;
xx=2;
console.log(xx+xx);//4
var xx=1;
var xx=2;
console.log(xx+xx);//4
但是let
和const
不允许重复减速
const yy=1;
const yy=2;
console.log(yy+yy);//Uncaught SyntaxError: Identifier 'yy' has already been declared",
let zz=1;
let zz=2;
console.log(zz+zz);//Uncaught SyntaxError: Identifier 'zz' has already been declared",
我在 here 中看到了一些类似的东西,
Assuming strict mode, var
will let you re-declare the same variable in the same scope. On the other hand, let
will not.
但是我想知道为什么let
和const
不允许重新申报?为什么 var
呢?以及 JavaScript 如何处理这三种类型的减速?
变量
var
关键字是 2016 年之前定义变量的唯一方法*。
无论您在哪里写 var x
,变量 x
都被视为在封闭范围的顶部声明(var
的范围是 "a function").
同一范围内变量的所有声明实际上是在谈论同一个变量。
这是一个例子...你可能会认为在函数中我们用fenton
覆盖了外部的name
,并将Fenton
添加到内部变量...
var name = 'Ramesh';
function myFunc() {
name = 'fenton';
var name = 'Fenton';
alert(name);
}
myFunc();
alert(name);
事实上,它就是这样工作的...由于提升,外部变量不受内部变量的影响。
var name = 'Ramesh';
function myFunc() {
var name;
name = 'fenton';
name = 'Fenton';
alert(name);
}
myFunc();
alert(name);
- 实际上,您也可以完全不使用
var
关键字来隐式声明它们,在这种情况下,它们将被添加到全局范围。细微的错误经常被跟踪到此。
let 和 const
let
和const
都是block-scoped,不是function-scoped。这使得它们像大多数其他 C-like 语言中的变量一样工作。事实证明,这比 function-scoped 变量更容易混淆。
他们也是"more disciplined"。它们应该在一个块中只声明一次。
const
关键字也不允许后续赋值 - 所以你必须用赋值来声明它(即你不能只写 const x
,你必须写 const x = 'Fenton'
) - 以后不能再赋值。
有些人认为这使得值不可变,但这是一个错误,因为值可以改变,如下所示:
const x = [];
// I can mutate even though I can't re-assign
x.push('Fenton');
// x is now ['Fenton']
为什么重要?
如果您想避免 var
的一些更令人困惑的方面,例如多个声明都对同一个提升变量有贡献,以及 function-scope,您应该使用较新的 [=22] =] 和 let
个关键字。
我建议使用 const
作为您的默认关键字,并且仅在您选择允许 re-assignment.
的情况下将其升级为 let
与var
不同,let
是ES2015规范。 specification 表示:
Redeclaring the same variable within the same function or block scope raises a SyntaxError.
这是为了改进普通版的范围var
。
假设您想知道此行为是否符合规范,请查看此 13.3.2
Within the scope of any VariableEnvironment a common BindingIdentifier
may appear in more than one VariableDeclaration but those declarations
collective define only one variable.
let
和 const
是最近的版本,而 var
可能与 Javascript 本身一样古老。
在过去 Javascript code-base 过去并没有因为太大而不必担心编程错误 而且很可能重点是确保 而不是报告变量re-declaration的错误 JS引擎应该处理它.
why does const and let not allow duplicate declaration?
c# 或 java(例如)处理重复变量名的方式有很大差异,其中名称冲突 returns 编译错误,以及它在 js 等解释型语言中的工作方式。请检查下面的代码片段: i
的值没有重复?并非如此,在函数和块上下文中,相同的变量名称被称为两个不同的变量,具体取决于声明它们的位置。
function checkLetDuplication() {
let i = 'function scope';
for ( let i = 0 ; i < 3 ; i++ )
{
console.log('(for statement scope): inside the for loop i, equals: ', i);
}
console.log('("checkLetDuplication" function scope): outside the for loop i , equals: ', i);
}
checkLetDuplication();
为什么var允许重复声明,但为什么const和let不允许重复声明?
var
允许重复声明
xx=1;
xx=2;
console.log(xx+xx);//4
var xx=1;
var xx=2;
console.log(xx+xx);//4
但是let
和const
不允许重复减速
const yy=1;
const yy=2;
console.log(yy+yy);//Uncaught SyntaxError: Identifier 'yy' has already been declared",
let zz=1;
let zz=2;
console.log(zz+zz);//Uncaught SyntaxError: Identifier 'zz' has already been declared",
我在 here 中看到了一些类似的东西,
Assuming strict mode,
var
will let you re-declare the same variable in the same scope. On the other hand,let
will not.
但是我想知道为什么let
和const
不允许重新申报?为什么 var
呢?以及 JavaScript 如何处理这三种类型的减速?
变量
var
关键字是 2016 年之前定义变量的唯一方法*。
无论您在哪里写 var x
,变量 x
都被视为在封闭范围的顶部声明(var
的范围是 "a function").
同一范围内变量的所有声明实际上是在谈论同一个变量。
这是一个例子...你可能会认为在函数中我们用fenton
覆盖了外部的name
,并将Fenton
添加到内部变量...
var name = 'Ramesh';
function myFunc() {
name = 'fenton';
var name = 'Fenton';
alert(name);
}
myFunc();
alert(name);
事实上,它就是这样工作的...由于提升,外部变量不受内部变量的影响。
var name = 'Ramesh';
function myFunc() {
var name;
name = 'fenton';
name = 'Fenton';
alert(name);
}
myFunc();
alert(name);
- 实际上,您也可以完全不使用
var
关键字来隐式声明它们,在这种情况下,它们将被添加到全局范围。细微的错误经常被跟踪到此。
let 和 const
let
和const
都是block-scoped,不是function-scoped。这使得它们像大多数其他 C-like 语言中的变量一样工作。事实证明,这比 function-scoped 变量更容易混淆。
他们也是"more disciplined"。它们应该在一个块中只声明一次。
const
关键字也不允许后续赋值 - 所以你必须用赋值来声明它(即你不能只写 const x
,你必须写 const x = 'Fenton'
) - 以后不能再赋值。
有些人认为这使得值不可变,但这是一个错误,因为值可以改变,如下所示:
const x = [];
// I can mutate even though I can't re-assign
x.push('Fenton');
// x is now ['Fenton']
为什么重要?
如果您想避免 var
的一些更令人困惑的方面,例如多个声明都对同一个提升变量有贡献,以及 function-scope,您应该使用较新的 [=22] =] 和 let
个关键字。
我建议使用 const
作为您的默认关键字,并且仅在您选择允许 re-assignment.
let
与var
不同,let
是ES2015规范。 specification 表示:
Redeclaring the same variable within the same function or block scope raises a SyntaxError.
这是为了改进普通版的范围var
。
假设您想知道此行为是否符合规范,请查看此 13.3.2
Within the scope of any VariableEnvironment a common BindingIdentifier may appear in more than one VariableDeclaration but those declarations collective define only one variable.
let
和 const
是最近的版本,而 var
可能与 Javascript 本身一样古老。
在过去 Javascript code-base 过去并没有因为太大而不必担心编程错误 而且很可能重点是确保 而不是报告变量re-declaration的错误 JS引擎应该处理它.
why does const and let not allow duplicate declaration?
c# 或 java(例如)处理重复变量名的方式有很大差异,其中名称冲突 returns 编译错误,以及它在 js 等解释型语言中的工作方式。请检查下面的代码片段: i
的值没有重复?并非如此,在函数和块上下文中,相同的变量名称被称为两个不同的变量,具体取决于声明它们的位置。
function checkLetDuplication() {
let i = 'function scope';
for ( let i = 0 ; i < 3 ; i++ )
{
console.log('(for statement scope): inside the for loop i, equals: ', i);
}
console.log('("checkLetDuplication" function scope): outside the for loop i , equals: ', i);
}
checkLetDuplication();