阿孜去面试-变量声明

178 阅读1分钟

Petal_Bug_I_R.jpg >> 说一下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)
}