标签:const 变量 作用域 JS 关键字 let var 声明
1.let关键字
先放let关键字声明变量的特点总结:
-
let关键字可以将变量绑定到当前所在作用域(通常是{ .. }内部)
-
无法在块级作用域之外的地方访问使用let命令声明的变量
-
不允许使用let关键字多次声明同一个变量
-
不存在变量提升,使用let关键字声明的变量一定要在声明之后使用,否则将报错
1.let关键字可以将变量绑定到当前所在作用域(2.无法在块级作用域之外访问声明的变量)
js的函数作用域不用说了,在函数内不论是用var还是let声明的变量是无法直接被外界访问到的。
但是JS的块级作用域,如:for(){ .. }
、if(){ .. }
、{ .. }代码块
等这种都是属于块级作用域,在这些块级作用域中使用var关键字声明的变量,是可以直接在块级作用域以外的地方访问到的,这样会增加污染全局变量的风险。
就像这样:
var a = 1;
if (true) {
var a = 2
}
console.log(a) // a
由于if循环里用var关键字重新给a赋了值,因此打印出来a是2。我们肯定不希望全局的a = 1
被污染,此时用let关键字就可以解决这个问题:
var a = 1;
if (true) {
let a = 2
}
console.log(a) // 1
此时在for循环里用let声明的a就被绑定到了这个for循环块级作用域中,在for循环代码块之外也就无法访问到了。
3.不允许使用let关键字多次声明同一个变量
这个非常容易理解了,就是一个变量无法用let关键字声明多次。
使用var关键字可以将同一个变量a多次声明为不同的值,但是使用let关键字声明的变量却只能声明一次,否则将报错:
let a = 1
let a = 2 // Uncaught SyntaxError: Identifier 'a' has already been declared
4.不存在变量提升
var关键字声明的变量存在变量提升问题
,就像下面:
console.log(a); // undefined
var a = 1
上面的var a = 1
会被拆分成这样:
var a
console.log(a) // undefined
a = 1
这就是变量提升,用var关键字声明的变量会先被提升到所在作用域的最顶端,等实际赋值时才将a赋值为1。
let关键字就可以避免这个问题,它会提前抛出异常:
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 1
2. const关键字
const关键字用来声明只读的一个常量。用const声明的变量的值无法被修改。不过需要注意的是声明的变量的类型是基础类型还是引用类型。
-
基础类型(Number、Boolean、String等)值就保存在变量指向的那个内存地址,因此等同于常量。
-
引用类型(Object、Array等)变量保存的只是一个指向书记数据的指针,const只能保证指向这个指针的值是不变的,至于它的数据结构是否改变时无法控制的
const关键字和let一样也可以把当前变量绑定到当前作用域中。
3.ES6声明变量的6中方法
ES5只有两种声明变量的方式:var
和function
。ES6除了添加let
和const
命令,还加了两种声明变量的方式:import
和class
命令
标签:const,变量,作用域,JS,关键字,let,var,声明 来源: https://www.cnblogs.com/codexlx/p/16392087.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。