js高级01--变量提升(预解析)、作用域、作用域链、递归、闭包

JavaScript是解释型的语言,但是他并不是真的在运行的时候逐句的往下解析执行。

我们来看下面这个例子:

func();functionfunc(){
     alert("Funciton has been called");
}

在上面这段代码中,函数func的调用是在其声明之前,如果说JavaScript代码真的是逐句的解析执行,那么在第一句调用的时候就会出错,然而事实并非如此,上面的代码可以正常执行,并且alert出来Function hasbeen called

所以,可以得出结论,JavaScript并非仅在运行时简简单单的逐句解析执行

注意:变量的提升相当于声明一个未赋值的变量,函数的提升相当于提升这个函数名即函数体,提升的变量值默认的是undefined;提升完之后按文档流的方式执行后面的代码进行赋值、调用操作。

 

预解析是分作用域的

声明提升并不是将所有的声明都提升到window对象下面,提升原则是 提升到变量运行的环境(作用域)中去。

 

    注意:

       1.变量和函数同名的时候 只提升函数,忽略变量名

       2.函数同名的时候都提升,但是后面的函数会覆盖前面的函数

       3.函数表达式,只会提升变量名,不会提后面的函数

       4.变量提升只会将变量和函数提升到当前作用域的最上方

块作用域(es6)

代码用{ }括起来的作用域就可看成块作用域

什么是作用域链

只有函数可以制造作用域结构,那么只要是代码,就至少有一个作用域, 即全局作用域。

凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。

将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。

绘制作用域链的步骤:

1.看整个全局是一条链, 即顶级链, 记为 0 级链

2.看全局作用域中, 有什么成员声明, 就以方格的形式绘制到 0 级练上

3.再找函数, 只有函数可以限制作用域, 因此从函数中引入新链, 标记为 1 级链

4.然后在每一个 1 级链中再次往复刚才的行

变量的访问规则

首先看变量在第几条链上, 在该链上看是否有变量的定义与赋值, 如果有直接使用

如果没有到上一级链上找( n - 1 级链 ), 如果有直接用,停止继续查找.

如果还没有再次往上刚找... 直到全局链( 0 级 ), 还没有就是 is not defined

注意,同级的链不可混合查找

 

 

 

 

//1.作用域

//变量的作用范围

 

//2.js中的作用域是词法作用域

 

//代码在写好之后,变量的作用域就已经确定,这个就是词法作用域

 

//3.js中没有块级作用域

 

//4.js中只有函数可以创建作用域

 

//5.变量提升

 

//在分析代码的时候,首先将以var声明的变量名和以function开头的函数,进行提升

 

//再去执行代码的具体执行过程

 

//1.变量的提升是分作用域的

 

//2.当函数和变量同名的时候,只提升函数,不会提升变量名

 

//3.函数同名,全都都会提升,但是后面的函数,会覆盖前面的函数

 

//4.函数表达式中函数的声明不会被提升,但是变量会被提升

 

//6 作用域链

 

//只要是函数,都会有作用域

 

//函数内部的作用域可以访问函数外部的作用域

 

//如果函数进行嵌套,就会构成一个链条的结构,这个就是作用域链

递归思想就是将一个问题转换为一个已经解决的问题来实现。(类似于for循环)

 

解决思路

函数内的数据不能直接在函数外被访问,是因为作用域的关系,上级作用域不能直接访问下级作用域中的数据。

闭包的基本结构

闭包的定义:一个函数在它父函数的内部,这个父函数可以访问到内部的那个函数的成员,内部的函数就成为闭包函数。闭包的闭包的理解:外部的函数要想访问内部函数的成员,根据作用域的原理是无法直接访问的,需要将内部函数的成员暴露到外部,外部函数才能访问。

一般闭包要解决的的问题就是要想办法间接的获得函数内数据的使用权. 那么我们的可以总结出一个基本的使用模型.

1.写一个函数, 函数内定义一个新函数, 返回新函数, 用新函数获得函数内的数据

2.写一个函数, 函数内定义一个对象, 对象中绑定多个函数( 方法 ), 返回对象, 利用对象的方法访问函数内的数据

//闭包的另外一种表现形式
function fun(){
    var num =23;
    function fun1(){
        console.log('num:'+num);
    }
    fun1();
}
fun();

 

 

 

若有不足请多多指教!希望给您带来帮助!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值