>> 说一下js中几种声明变量的区别、暂时性死区、块级作用域
<< 有val,let,const(后面两种是es6增加的)
function foo(){
console.log(age)
var age = 20
}
foo() // undefined
// val声明被提升
function foo(){
var age
console.log(age)
age = 20
}
foo() // undefined
function foo(){
var age = 20
var age = 22 // 没有报错
var age = 23
console.log(age)
}
foo() // 23
// let的块级作用域
if(true){
var age = 20
console.log(age)
}
console.log(age) // 20
if(true){
let age = 20
console.log(age)
}
console.log(age) // Uncaught ReferenceError: age is not defined
// var声明在了循环块外面
for(var i = 0;i < 5; i++){
setTimeout(()=>console.log(i))
}
console.log(i) // 5
// 5 5 5 5 5
// let 作用域在for循环内部
for(let i = 0;i < 5; i++){
setTimeout(()=>console.log(i))
}
console.log(i) // i is not defined
// 0 1 2 3 4
// 暂时性死区:js引擎会注意到后面的let,但没有引用未声明的变量。let声明之前的执行瞬间被称为暂时性死区,在此阶段之前引用后面才声明的变量会报错。
console.log(name,2) // undefined
var name = 'duzi'
console.log(name) // Uncaught ReferenceError: name is not defined
let name = 'duzi'
// const引用的是对象,可以修改内部的属性
const persion = {}
persion.name = 'duzi'
console.log(persion) // {name: 'duzi'}
for(const i = 0;i < 5;i++){} //Uncaught TypeError: Assignment to constant variable.
// 1 2 3 4 5
for(const val of [1,2,3,4,5]){
console.log(val)
}