作用域、函数解析、递归

作用域:

    任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。

作用域的划分:局部作用域和全局作用域

    全局作用域(变量):整个程序都有效,即整个代码中都可以调用(变量前面没有添加var变成全局的属性)

    局部作用域(变量):只对函数内部有效,即只能在本变量声明的函数内部调用。

 

函数内部的var声明的变量就是局部变量,其他的变量都是全局

形参:也是函数的局部变量 只能在函数内部使用

函数的作用域是半透明的,里面看到外面,外面看不到里面。

特殊情况:函数内部的变量都是局部变量,但是如果声明的时候,没有添加var关键字,变成全局的。

 

作用域链:由内到外

通俗地讲,当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。

当执行函数时,总是先从函数内部找寻局部变量如果内部找不到(函数的局部作用域没有),依次向上查找。

在函数体内,局部变量的优先级高于同名的全局变量-作用域链


js的预解析(解析的过程)分成两大步:

    1.js的预编译,执行之前的一瞬间。(看不到,浏览器自动完成)

        第一阶段(预编译期): JS会对本代码块(script)中的所有声明的变量和函数进行处理,但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。

            1.1:找变量var,找到了变量提前赋值undefined.  找普通函数function,找到了将整个函数体给函数名。

            1.2:如果变量名和函数名重名了,函数名优先。

            1.3:函数内部依然要做预解析(函数的参数相当于函数内部的变量,依然做预解析)。

            1.4:if语句和for语句里面的变量和函数做预解析提前赋值undefined,函数声明不会跳过。

        第二阶段:函数的形参也是函数内部的变量,同样做预解析

    2.js代码的逐行执行,遇到错误终止。(逐行执行碰到普通的函数声明,直接跳过)

猜你喜欢

转载自blog.csdn.net/qq_39264561/article/details/106909801
今日推荐