var声明变量
var name = \"大众bob\公众;
var声明变量的特点:
console.log(name);var name = \公众bob\"大众;覆盖全局工具存在的变量
var RegExp = \"大众myRegExp\"大众;console.log(window.RegExp); // 覆盖了正则表达式工具,输出 “myRegExp”
let声明变量

let声明变量的特点:
不许可重复声明变;不存在变量提升机制;只在当前浸染域内有效;临时去世区(TDZ)- 利用未实行过的变量会报错。let name = \"大众bob\公众;
const声明常量
const声明变量的特点
声明常量,声明时必须赋值;不许可重复声明变;不存在变量提升机制;只在当前浸染域内有效;临时去世区(TDZ)- 利用未实行过的变量会报错;常量声明后不许可修正其值(下面有详细的解释)。const USER_NAME = \"大众Bob\公众;
声明变量或者常量都会在内存中开辟一个内存地址来装载这个变量的值,const声明的常量后,就不许可改变这个常量所在的内存地址了,但是可以修正这个绑定的内存地址的值,比如来说,String类型的值是不可改变的,以是利用const声明一个字符串的常量之后就不许可修正了,比较声明了一个工具类型的常量,就可以修正其工具的值,由于修正的是其工具(绑定的常量的地址的值)的值,而不是修正绑定常量的地址。
const USER = { name: 'bob', nationality: 'China'}USER.name = 'Lynn';console.log(USER); // 输出: { name: 'Lynn', nationality: 'China' }// 缺点:TypeError: Assignment to constant variable.// 缘故原由:修正了绑定的内存地址USER = { name: 'Lynn', nationality: 'China'}console.log(USER);
变量提升机制与TDZ(临时去世区)
JavaScript引擎在扫描代码变量声明时:
如果扫描到 var 声明的变量 => 会将其提升到浸染域的顶端,此时其值是undefined;这便是var声明的变量提升机制。
&&
如果扫描到 let 或 const 声明的变量 => 会将其放入到 TDZ 中,如果访问TDZ中的变量就会报错,只有实行过了变量声明,变量才会从TDZ中移除,才能正常访问,这便是为什么浸染域中存在let和const声明的变量,如果没实行到变量声明,会抛出错误的缘故原由。
// var 变量提升机制console.log(name); // undefinedvar name = \"大众bob\"大众;// let 与 const 的临时去世区(TDZ)console.log(name); // ReferenceError: name is not definedlet name = \"大众bob\"大众;console.log(USER_NAME); // ReferenceError: USER_NAME is not definedconst USER_NAME = \"大众bob\"大众;
实例-循环中的块级浸染域绑定
由于在for循环中利用var声明变量,既没有存在块级浸染域,也存在了一贯共用同一个变量。
var arr = []for (var i = 0; i < 10; i++) { arr[i] = function test() { console.log(i); }}arr[1]() // 10arr[3]() // 10arr[5]() // 10arr[7]() // 10// 为什么都输出是10,缘故原由是arr[i]的各项函数不是立即实行的,在表面调用利用,for循环已经结束,i的值是10
利用立即实行函数能到达效果:
var arr = []for (var i = 0; i < 10; i++) { (arr[i] = function test(value) { console.log(value); // 0,1,2,3,4,5,6,7,8,9 })(i)}
利用let块级声明
var arr = []for (let i = 0; i < 10; i++) { arr[i] = function test() { console.log(); }}arr[0]() // 0arr[3]() // 3arr[5]() // 5arr[7]() // 7// 为什么修正let声明后到达了预期中的效果?// 缘故原由:let声明的变量是存在块级浸染域,每次循环的i实在都是一个新的变量
末了
ES6添加了let与const声明变量后,推举声明变量时默认利用const,如果须要修正改变该值时,利用let声明变量,使工程师写JS代码时变得更加健壮。
作者:梁凤波
链接:https://www.imooc.com/article/275459