搜索
写经验 领红包
 > 运动

js预解析(js预解析面试题)

导语: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

写在最后

这就是本次我的学习感想,可能不是很全面,还请大家多多批评!

本文内容由小熊整理编辑!