什么是变量提高?
JavaScript 中,函数及变量的声明都将被提高到函数的最顶部。
JavaScript 中,变量能够在使用后声明,也就是变量能够先使用再声明。
一)var声明变量存在变量提高,let和const不存在变量提高面试
console.log(a); // undefined ===> a已声明还没赋值,默认获得undefined值 var a = 100; console.log(b); // 报错:b is not defined ===> 找不到b这个变量 let b = 10; console.log(c); // 报错:c is not defined ===> 找不到c这个变量 const c = 10;
再来看这段代码函数
function fn() { //var a if (true) { console.log(a + ' now') } else { var a = 1 console.log(2) } } fn() // a -> undefined
咱们发现不执行的代码也会影响会执行的代码,由于var a会提高到if语句的前面网站
undefined能够翻译为不明确,not defined能够翻译为未定义
在Java中变量的分为全局变量(成员变量)或者局部变量,在方法体中定义的变量都是局部变量,不然是全局变量(即在方法体外,在类中定义的变量)spa
在JavaScript中,在方法体外外用var定义的变量其它方法能够共享,在方法中用var定义的变量只有该方法内生效。翻译
二)let、const都是块级局部变量
顾名思义,就是只在当前代码块起做用code
{ let a = 1 } console.log(a) // undefined
const 的特性和 let 彻底同样,不一样的只是
1)声明时候必须赋值blog
const a
编译器报错
控制台报错ip
SyntaxError: Missing initializer in const declaration
2)只能进行一次赋值,即声明后不能再修改作用域
const a=1 a=2
编译器报错
控制台报错rem
TypeError: Assignment to constant variable.
3)若是声明的是复合类型数据,能够修改其属性
三)同一做用域下let和const不能声明同名变量,而var能够
const a =2 const a=1
SyntaxError: Identifier 'b' has already been declared
简单的Demo
for (let i = 0; i < 5; i++) { console.log(i) }
上面的代码咱们知道打印结果是 0, 1, 2, 3, 4,可是大家有没有想过这个变量i的做用域究竟是什么呢?
有人说在这个for循环里呀,可是我这里想说的是这个i做用域是在括号()里。正常的代码是这样的:
1.首先这个变量_i的做用域是在()里才有效的,循环体里是不能访问到_i的
2.每次循环的时候建立一个i变量,将括号里的_i赋值到变量i上
3.最后i++后再将变量i的值赋值回_i上
固然这个过程是很复杂的,能够用下面代码理解,可是JS的实现机制是很复杂的,这里想要说明的let i的做用域有时候并非咱们所理解的那样的。
for (let _i = 0; i < 5; i++) { let i = _i console.log(i) // i++ 先作 _i = i }