预编译习题

214 阅读1分钟
function fn(a, c){
    console.log(a)
    var a = 123
    console.log(a)
    console.log(c)
    function a(){}
    if (false){
        var d = 678
    }
    console.log(d)
    console.log(b)
    var b = function (){}
    console.log(b)
    function c(){}
    console.log(c)
}
fn(1, 2)
// 预编译
// 作用域的创建阶段即预编译的阶段
// 预编译的时候做了哪些事情
// 在函数作用域创建阶段 产生js的变量对象 也称为AO对象 供js引擎自己去访问的
// 1 创建了AO对象 
// 2 找形参和变量的声明 作为AO对象的属性名 值是undefined
// 3 实参和形参相统一
// 4 找函数声明 如果函数声明的名称和变量声明的名称一致的话 会覆盖变量的声明
AO: {
    a: undefined 1 function a(){}
    c: undefined 2 function c(){}
    d: undefined
    b: undefined
}
// js的解释执行 逐行执行
function fn(a, c){
    console.log(a) // function a(){}
    var a = 123
    console.log(a) // 123
    console.log(c) // function c(){}
    function a(){}
    if (false){
        var d = 678
    }
    console.log(d) // undefined
    console.log(b) // undefined
    var b = function (){}
    console.log(b) // function (){}
    function c(){}
    console.log(c) // function c(){}
}
fn(1, 2)

参考视频