javaScript基础(4):(js预编译)

130 阅读2分钟

打好基础,查漏补缺

基础是重中之重

函数声明和函数表达式

函数定义有两种方式,一种是函数声明,一种是函数表达式

函数表达式中函数名称会自动放弃函数名称

js执行过程

1、语法分析

2、预编译 ( 发生在函数执行的前一刻 )

3、解释执行

js在执行之前会通篇扫描查看是否有基础语法错误,然后预编译在逐行解释执行

预编译过程

预编译前奏

1、imply global 暗示全局变量

任何变量在未声明就赋值时,该变量就归全局所有.

function test(){
    var a = b =3
}
test()
window.b = 3

2、一切声明的全局变量,全是window的属性

window就是全局的域

预编译过程

函数内部预编译有4步。

1、创建AO对象 Activation Object (执行期上下文)

2、找到变量和形参,将其作为属性放入AO对象,值为undefined

3、统一实参和形参的值

4、找到函数声明,将函数名作为属性放入AO对象,函数值为函数体

function test(a){
    console.log(a) // function
    var a = 123
    console.log(a) // 123
    function a(){ }
    console.log(a) // 123
    var  b= function(){ }
    console.log( b) // function
    function d(){ }
}
test(1)

全局的预编译

第一步生成GO对象 global Object

GO === window

无同步形参与实参值的过程

块级作用域中声明函数

2020/06/12

今天在看es6块级作用域时,发现了一些有点不理解的问题。


        function f() { console.log('I am outside!'); }

        (function () {

            console.log(f)

            // var f = 0
            if (true) {

                console.log(f)

                f()

                // f = 1

                function f() { console.log('I am inside!'); }

                f = 2

            }
            console.log(f)
            //  f();
        }());

在我断点后发现,在块级作用域中声明函数,首先会现在当前函数作用域或者全局作用域中 提升一个变量为undefined, 然后在块级作用域中 提升变量 为函数体。

当if中条件为 true

最后一个打印 输出为 函数体

将f = 1 注释放开 ,最后一个打印输出为 1

说明执行了函数声明的代码后,影响到了外层函数作用域

当if中条件为fasle

所有打印都为 undefined