面试题看JS执行机制

题目一:

        var x = 10
        function fn() {
            console.log(x)
        }

        function show(f) {
            var x = 20
            f()
        }

        show(fn) //10

这个题如果一定要解释的话可能需要涉及到JS引擎的执行机制(也有可能这样说并不是很合适)

JS引擎工作分为两个阶段,一个是语法检查阶段,一个是运行阶段.而运行阶段又分为预解析和执行阶段
在预解析阶段,先创建执行上下文,执行上下文包括变量对象,作用域链和this值

  • 变量对象VO: var声明的变量,function声明的函数,以及当前函数的形参
  • 作用域链: 当前变量对象 + 所有父级作用域
  • this: 在进入执行上下文之后不再改变

从这个角度来说,fn的作用域是在全局的,所以x访问的应该是10,它的作用域跟他在哪里被调用没有啥关系

题目二:

        (function(){ var a=b=3; })()
        console.log('a defined?'+(typeof a !== 'undefined')) // a defined?false
        console.log('b defined?'+(typeof b !== 'undefined')) // b defined?true

这里的自执行函数中,a 是用var关键字声明的,是函数内的局部变量,而b 没有用关键字声明,属于隐式全局变量.
所以当我们在外部访问a 的时候会报错,a is not defined, 然后typeof a == undefined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值