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()。

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

欢迎大家批评指正哈。

原文地址:https://www.cnblogs.com/zdhblog/p/6801412.html