JS 作用域面试题

本文详细解释了JavaScript中函数的块级作用域、变量提升机制以及如何在面试中判断变量的存在。讨论了函数内部和外部对变量的访问,以及变量提升对代码执行的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

规则

  1. 除了函数外,js没有块级作用域,查看demo1
  2. 作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量,查看demo1代码一,demo2(注意:内部有该变量就先用该变量,没有再逐一向外查找demo2 代码二)
  3. 声明变量的是var还是window. 查看面试题一
  4. JS有变量提升的机制,查看面试题二,面试题三
  5. 优先级:声明变量>声明函数>参数>变量提升(不用记)

面试的时候怎么看?

1.本层作用域有没有该变量【注意变量提升】

2.注意:js除了函数外没有块级作用域

demo1

函数有块级作用域,该案例外部无法获取函数内部的变量

代码一

function fun(){
    var a = '123'
}
fun()
console.log(a) // a is not defined

除了函数以外,没有块级作用域,let和const定义的变量先除开

代码二

if(true){
    var a = 9;
}
console.log(9) // 9

for(var j=0; j<10; j++){}
console.log(j) // 10

demo2

内部可以访问外部的变量

代码一

var a = 60
function fn(){
    console.log(a)
}
fn() // 60

注意 代码二

var a = 10
function fn(){
    var a = 20
    function foo(){
        var a= 30
        console.log(a)
    }
    foo();
}
fn() // 30

面试题一

var a = b = 10;可以看成是var a = 10; window.b = 10

(function(){
    var a = b = 10;
    // var a = 10;
    // b = 10;
    // window.b = 10;
})()

console.log(b)  // a is not defined
console.log(b) // 10

面试题二

注意!!

function c(){
    var b = 1
    function a(){
//这里第一行不会向外找b,因为下面有var b,就会进行变量提升,不会向上一层去找b了
        console.log(b) //undefined
        var b = 2;
        console.log(b) //2
    }
    a()
    console.log(b) //1
}
c()

面试题三

函数作用域里面有name,变量声明提升

var name = 'World';
(function(){
//var name = undefined 声明悬挂
    if(typeof name === 'undefined'){
        var name = 'Jack';
        console.log('goodbye ' + name)
    }else{
        console.log('hello ' + name)
    }
})()
// goodbye Jack

类似的面试题

// var a = undefined
console.log(a) // undefined
if(false){
    var a = 10;
}
console.log(a) // undefined

优先级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值