Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、alert函数
- 下面的代码中,首先会弹出1,然后弹出undefined
- 因为alert是一个函数,所以会传进去的参数是函数时,会先执行传入的函数,弹出1,然后将这个函数的返回值(函数默认的返回值为undefined)undefined作为alert的参数,即弹出undefined
二、闭包
- 下面的代码中,第一次弹出1,第二次弹出1,第三次弹出2
- 当执行
fn1()()时,首先会执行fn1(),这时会声明变量a,并将0赋值给a,然后返回函数fn2,根据闭包的特点,fn1以其作用域不会被垃圾回收机制释放。再执行fn2(),此时执行++a时,首先会查找当前作用域,没有再去父级作用域查找,找到a=0,然后执行a自增后a=2,然后执行alert(a),弹出2 - 在执行
var newFn = fn1()时,会执行fn1函数,声明并定义变量a=0,然后将返回函数fn2赋值给newFn,根据闭包的原理,只要newFn一直引用fn2,fn1以其作用域不会被垃圾回收机制释放,所以最后两行代码访问的都是同一个作用域a,所以会依次弹出1和2
三、函数this指向和预解析
- 下面代码第一次弹出undefined,第二次弹出100
- 执行
alert(a)时,首先会在当前函数作用域中查找变量a。在代码执行前会进行预解析,预解析var a = 10;时,会进行变量提升,此时在作用域中会声明变量a,并且a=undefined,所以执行alert(a)时会在当前作用域查找到a=undefined,即弹出undefined - 执行
var a = 10;时,由于预解析阶段已经完成了变量声明,所以此行代码就是执行赋值操作,将10赋值a - 函数的this指向函数的调用者,如果没有调用者就指向window,所以this.a=window.a=100,所以最后弹出100