JS考题作用域

249 阅读1分钟
  1. 除了函数外,js没有块级作用域
  2. 作用域链:内部可以访问外部变量,但是外部不能访问内部变量,优先找内部再找外部,注意内部变量提升
  3. 声明变量用var还是window
  4. js变量提升机制
  5. 优先级:声明变量 > 函数声明 > 参数 > 变量提升
console.log(a)
if(false){
    var a = 10
}
console.log(a) // undefined

// if花括号里面的var a 会被提升
var a = 10
function test(){
    console.log(a) // undefined
    var a = 20
    console.log(a) // 20
}

test()

// test函数是块作用域, test作用域里面能找到变量a,不会继续往上寻找
function test(){
    var a = 10
    function a(){}
    console.log(a) // 10
}
test()

// 变量优先级高于函数声明,先找到var a
function test(){
    var a = 10
    var a = function () {}
    console.log(a) // ƒ () {}
}
test()

// 同样都是var 声明,函数表达式优先级高于变量声明
function test(){
    console.log(a) // ƒ () {}
    var a = 10
    function a() {}
}
test()

// 函数声明优先级大于变量提升
function fun (a) {
    console.log(a)
    var a = 10
}

fun(100)
// 参数优先级大于变量提升
function fun (a) {
    console.log(a) // ƒ a(){}
    function a(){}
}

fun(100)
// 参数优先级大于变量提升
function fun(){
    a = 10
    console.log(a) // 10
    var a = 20
    console.log(20)
}
// var a变量提升了,a = 10 相当于是重新赋值,而不是window.a了