浅析Js中const,let,var的区别及作用域

在 JavaScript 中,const、let 和 var 是用于声明变量的关键字,但它们之间存在显着差异,主要在作用域、声明的提升、重复声明以及是否可以重新赋值方面。

1 .适用范围 var:在 ES6 之前,JavaScript 只有全局作用域和函数作用域。
使用 var 声明的变量的作用域是函数级或全局作用域。
如果在函数内部声明,则该变量只能在函数内部访问;如果在函数外部声明,则可以在全局范围内访问该变量。
此外,用 var 声明的变量会受到变量提升的影响,即变量声明将提升到其范围的最大值,但赋值操作不会提升。

let:ES6 引入了 let 关键字来声明块级作用域变量。
let 声明的变量仅在 let 命令出现的代码块内有效,这意味着它们的作用域仅限于包含它们的块(由 {} 包围)。
与 var 不同,let 声明的变量不会提升到作用域顶部,因此不存在变量提升问题。
此外,let 不允许在同一作用域或块中重复声明变量。

const:const用于声明只读常量。
一旦声明,常量的值就不能更改。
与 let 一样,声明为 const 的变量也具有块级作用域,并且不会提升到作用域的顶部。
此外,声明为 const 的变量必须在声明时初始化,并且以后不能重新赋值。
需要注意的是,虽然声明为 const 的变量不能重新赋值,但如果该变量是对象或数组,则可以更改其属性或元素。

2 宣传声明和重复声明 var:由于用 var 声明的变量会受到变量提升的影响,因此可以在声明之前使用该变量(尽管这可能会导致未定义的行为)。
此外,var 允许您在同一范围内重复声明变量,随后声明的变量将覆盖先前声明的变量。

let 和 const:let 和 const 声明的变量没有变量提升,因此在声明之前不能使用变量。
此外,let 和 const 都不允许在同一作用域或块中重复声明变量。

3 重新分配 var:使用var声明的变量可以重新赋值。

let:使用let声明的变量也可以重新赋值。

const:使用const声明的变量不能被重新赋值。
尝试重新分配将导致运行时错误。
但是,如果const声明的变量是一个对象或数组,则可以更改其属性或元素的值(因为这里更改的是对对象或数组元素的引用,而不是常量本身的值)。

4 全局范围内的变量 var:在全局范围内使用var声明的变量将成为全局对象(通常是浏览器中的window对象)的属性。
因此,可以通过全局对象访问这些变量。

let 和 const:在全局范围内使用 let 和 const 声明的变量不会在全局对象上创建属性。
这意味着它们不会成为window对象的属性,因此无法通过window对象访问这些变量。
相反,它们被存储在特殊的环境中在全局范围内,对 JavaScript 引擎内部可见,但对外部代码不可见(例如通过 window 对象)。

总而言之,const、let 和 var 各自具有独特的作用域规则、声明提升行为、重复声明的限制以及 JavaScript 中的重新分配功能。
理解这些差异对于编写健壮且可维护的 JavaScript 代码至关重要。

如何更好的理解javascript变量类型以及变量作用域

啊...JS...真的很有趣...变量类型...与Java和C如此不同...
JS没有类型...弱检测...你知道...i=1 00; // This is a numeric type... then i="variable"; // This becomes a string again... i={x:4 }; // This is an object... i=[1 ,2 ,3 ]; // 这是一个数组...相同的变量...不同类型的数据赋值...编译器检测不到太多...
这确实很灵活...但是调试...真的很尴尬...尤其是在编写长代码时...它会导致问题...我检查了很长时间...全局变量和局部变量...
当JS运行...首先它创建一个全局对象...您定义的全局属性...是该对象的属性...所以在顶级代码中...您可以使用 this 或 window...以及在局部变量函数中访问它们...仅当函数运行时。
可以访问...只有一个对象可以调用...函数一结束...局部变量就消失了...
所以设计程序的时候要仔细考虑...如何声明变量...这样内存开销就少了...克隆变量不容易...
变量作用域...这是一个大问题...JS中的作用域...相对于Java和C...似乎更自由...
关键...不在JS中块级作用域...函数中的变量...在整个范围内有效函数...例如例如...
javascript <脚本语言=“JavaScript”类型=“文本/JavaScript”> //定义输出函数 函数输出{ 文档.writeln(s); } //全局变量 变量 i = 0; //external function definition 外部函数(){ //access global variables 输出(一); // 0 //内部函数定义 内部函数(){ //定义局部变量 变量 i = 1 ; // 我=1 ;如果使用隐式声明,全局变量 i 将被覆盖。
输出(一); // 1 } 里面(); 输出(一); // 0 } 外部(); </脚本>
输出是01 0...这证明...当JS在函数体内使用var声明一个变量...这个变量...只在该函数体内有效...当函数完成时...局部变量消失...
还有一个需要注意的主要问题...例如这个例子...
javascript <脚本语言=“JavaScript”类型=“文本/JavaScript”> //定义输出函数 函数输出{ 文档.writeln(s); } //全局变量 变量 i = 0; //external function definition 外部函数(){ //访问全局变量 输出(一); // 0 //Internal function definition 内部函数(){ 输出(一); // 未定义 变量 i = 1 ; 输出(一); // 1 } 里面(); 输出(一); // 0 } 外部(); </脚本>
JS 变量作用域...好吧...var 已定义...它是作用域中的变量...第一次打印 a 之前...JS 在预编译分析中已将 a 分配给了更改...因此更改的第一个输出是...
当调用 fun() 函数时...JS 创建了一个新作用域...在打印 a...之前将所有 var 变量的值初始化为未定义...因此 fun() 的第一个输出是未定义...第二个输出已经分配了值...因此新值是 这是输出...
函数内部和外部的两个...是两个不同的变量...例如...
javascript <脚本语言=“JavaScript”类型=“文本/JavaScript”> 变量b; 函数乐趣(){ b=“改变”; } 警告(b); // 未定义的输出 </脚本>
变量b是在函数外部定义的...函数内部给b赋值了...输出未定义...嗯...JS中的变量作用域...这真是令人沮丧...