JavaScript预编译

    js(JavaScript)中的关于执行顺序 是一个挺头疼的事情,有不少朋友关于预编译 只记两句话:所有变量 声明整体提升,所有函数声明整体提升。确实 只记这两句可以解决一些,但是有些浅,如果要解决下面这道题

    a(10)

    function a(a){   

        a = 1;        

        console.log(a)

        var a

        console.log(a)

    }

    console.log(a)

    var a = 1;

    懵了吧。如果只靠那两句话是无法 走天下的。不墨迹了,直接进入主题

    这里啰嗦一点,说一下形参和实参,形参就是函数声明后面的那个 () 里面所定义变量,实参就是在调用的时候实际所传的值

    function student(name, age){//name、age 属于形参

        

    }

    student("蜗牛", "300")//属于实参

    预编译:

        在函数(function)执行的前一刻的时候,会先做创建一个执行期间上下文,也就是预编译环节,有四个步骤

            第一步骤:创建AO对象(Active Object活动对象)

            第二步骤:函数体内所有变量声明整体提升,值为undefined(注意:形参也属于变量声明)

            第三步骤:使形参、实参值相对应,也就是把实参的值赋给性参

            第四步骤:所有函数声明(不是表达式!)整体提升,值为函数体。如果变量和函数名称相同,函数将会覆盖掉变量的值

        这个是function函数的预编译环节,其实整个js文件也可以当成一个函数,script标签当成function关键字,那么全局也是有自它自己的预编译环节的。

            第一步骤:创建GO对象(Gloabl Object全局对象)

            第二步骤:函数体内所有变量声明整体提升,值为undefined

            第四步骤:所有函数声明(不是表达式!)整体提升,值为函数体。如果变量和函数名称相同,函数将会覆盖掉变量的值

        这个是全局的预编译环节。

        函数在执行的前一刻的时候会产生一个执行期上下文,一个执行期上下文所对应的是一个函数在执行期间的环境,每个执行期上下文都是独一无二的,在函数执行结束之后,执行期上下文就会被销毁,多次调用同一个函数,会产生多个执行期上下文。

    上面这一点必须理解记住,不然后面的作用域、作用域链、闭包都会受到影响。

    现在回过头来看前面那道题,是不是so easy了?如果有哪些地方不理解 或者 认为我哪些地方写的有问题,请在下面评论。


猜你喜欢

转载自blog.csdn.net/weixin_39961451/article/details/80014797