> 运动
js预解析(js预解析面试题)
导语:JS之预解析
今天我给大家分享一下我在学习js过程中遇到的一个知识点 -- Js预解析
我们知道,浏览器在运行JS代码前,JS本身会先对代码做一遍分析,这个分析过程总共分为两步:
定义
1.这一步是将所有代码中的变量声明和函数体放在作用域的最前面
2.如果变量名和函数体名重复,那么函数体就会覆盖掉变量名
执行
代码从上往下依次逐行执行
举例
function foo() { alert(1)}var a = 10;foo()alert(a)
第一步,先定义
function foo() {...}var afoo()alert(a)
第二步,执行
当执行foo()时,在函数体内部又进行了一次预解析,即定义和执行两步
foo()内部没有变量声明,则直接弹出1
当执行到alert(a)的时候,此时a被修改为10
则弹出10
即最后的结果为1、10
我们再来举一个例子
function a() { alert(b) var b = 9}var a = 10;a()alert(a)
第一步,先定义
function a() {...}var a = 10;alert(a)a()
第二步,执行
当执行alert(a)的时候,此时a已经被重新赋值为10,既弹出10
当执行a()时,此时a依然为10,则此处报错,a不是一个函数
再来看一个比较复杂的
function fn() { console.log(a); var a = 123; console.log(a); console.log(c); function a() {} if (false) { var d = 23; } console.log(d); console.log(b); var b = function() {} console.log(b); function c() {} console.log(c); } fn()
第一步,先定义
把函数体放在作用域的最前面
function fn(){...}fn()
第二步,执行
在函数体内部有一次进行定义和执行两个步骤
既就是:
function fn() { function a(){} var d var b function c(){} }
当执行第一个a的时候,弹出function a(){}
当执行第二个a的时候,此时a已经被重新赋值为123,则弹出123
执行c时,弹出函数体c
执行d时,弹出undefined
执行第一个b时,弹出undefined
执行第二个b时,弹出函数体
执行c时,弹出函数体c
写在最后
这就是本次我的学习感想,可能不是很全面,还请大家多多批评!
本文内容由小熊整理编辑!