• JavaScript中变量、参数、函数之间的关系


    废话不多说,直接开始。

    我们看一段代码(参考其他资料所得)

    <script type="text/javascript">


        function a(b){

            console.log(b);

            function b(){

            console.log(b);
           }
    }
    a(1);
    </script>

    运行结果是什么呢?请各位读者先不要运行代码,先思考一下猜猜结果。

    ——————————————————————————————————

    不管你想的结果是几个,不管你想的结果是不是1,唯一结果是:

    function b(){
    console.log(b);
    }

    是的,结果很以外(大神们请忽视我们这些小白),那为什么会出现这样的结果呢?我们来根据结果逆推分析一下。

    首先分析这段代码:

        1.创建函数a(b),传递的参数是b,

        2. 输出b,

        3.a函数里面在输出b后声明一个函数b(),这个b()函数内容是输出b,

        4.调用函数a(1),传递1.

    然后分析代码的运行:

         1、这个输出是哪一行的呢?这段代码运行时只调用了a()函数,b()函数只是声明而没有调用,所以这个输出是函数a()里面的输出,即第一个confole.log(b);

         2、既然知道了输出语句,就分析输出内容,很明显输出的是b

         3、根据输出结果,这个b不是传递过来的参数b(调用时是1),而是a()函数里面声明的子函数function b(),

         4、传递的参数失效了

    总上分析,我们好像明白了一点,在函数a()里面,子函数声明的优先级(暂且这样说)好像比参数的高啊

    所以,虽然调用a()时传递了1给b,但是有立刻将b()函数给了变量b,执行后就输出了function b()函数。

    拓展:

    通过以上的案例,并查询其他资料,我总结一下函数中内部执行流程。

    一段代码写完后到运行结束,分为两个时期(我虽然学过编译原理,但是跟没学一样,所以不会用词):读、运行。

    1、读一段代码时,只管变量和函数的声明,不管赋值,比如 var a=3;只知道有个变量叫a,值不管。

    2、运行代码时,比如调用函数a(1),传递参数1给形参b,之后并不执行cosole.log()函数,而是继续找子函数声明,于是找到了函数function b(),这个函数赋值给变量b

    3、读完了,到了运行代码,运行console.log(b),自然输出了function b()。

    可能我的知识不足,上面涉及到的我只能这样说了,以后有机会了好好研究研究。

    欢迎大家批评指正哈。

  • 相关阅读:
    pair<,>
    PTA 5-8 File Transfer (25)
    PTA 5-6 Root of AVL Tree (25)
    PTA 5-5 Tree Traversals Again (25)
    HDU4288 Coder(线段树)
    CodeForces 371D Vessels(树状数组)
    POJ2762 Going from u to v or from v to u(单连通 缩点)
    LightOJ 1030 Discovering Gold(期望 概率)
    HDU5115 Dire Wolf(区间DP)
    HDU4008 Parent and son(树形DP LCA)
  • 原文地址:https://www.cnblogs.com/zdhblog/p/6801412.html
Copyright © 2020-2023  润新知