面向对象--第四篇(变量提升&闭包)

JavaScript

instansof

判断一个构造函数的原型是不是存在于该对象的原型链上

javascript中所有的对象 都会有  Object.prototype
所以 所有的对象 instanceof Object 都是true

歌曲列表管理案例

递归

自己调用自己

化归思想

化繁为简,化未知为已知

递归的两个要素

1.自己调用自己
2.有递归结束条件

使用递归获取后代元素

作用域

什么是作用域

变量起作用的范围

什么是块级作用域

JS中没有块级作用域,使用代码块限定的作用域就是块级作用域

JS中的作用域叫做 词法作用域

词法作用域

在代码写好的时候,就能确定变量的作用域,这种作用域就是词法作用域

动态作用域.(是词法作用域就不可能是动态作用域)

在js当中,只有函数能创造作用域

var num = 123;
function f1(){
    console.log(num);  //如果是动态作用域打印的就是456 如果是词法作用域 打印123
}
function f2(){
    var num = 456;
    f1();
}
f2();

变量提升

JS代码的运行分两个阶段
* 预解析阶段
    * 变量名和函数提升
        将var声明的变量名和function开头的函数进行提升
        提升到当前作用域的最上方
* 执行阶段

注意:
    1.变量和函数同名的时候
        只提升函数,忽略变量名
    2.函数同名的时候
        都提升,但是后面的函数会覆盖前面的函数
    3.函数表达式,只会提升变量名,不会提后面的函数

    4.变量提升只会将变量和函数提升到当前作用域的最上方
    ```js
     funciton foo(){
        var num =123;
     }
    ```
    5.变量提升是分块 <script> 的

    ```html
    <script>
    foo()
    function foo(){
        console.log("第一个script标签内的函数")
    };
    </script>

    <script>
    foo()
    function foo(){
        console.log("第2个script标签内的函数")
    }
    </script>
    ```
    6.条件式函数声明 能否被提升,取决于浏览器, 不推荐使用!!!
    ```
    foo();//会报错,因为未被提升
    if(true){
        function foo(){

        }
    }


    ```

作用域链

只要是函数都有作用域,函数内部的作用域可以访问函数外部的作用域
当多个函数嵌套的时候,就会形成一个链式的结构,这个就是作用域链

绘制作用域链图的步骤

1.先绘制0级作用域链
2.在全局作用域中查找,变量和函数的声明,找到之后,将所有的变量和函数用小方格放在0级作用域链上
3.再从0级作用域链上的函数引出1级作用域链
4.再去每一个1级作用域链中查找变量和函数的声明,找到之后.....
5.以此重复,就画好了整个作用域链

变量的搜索规则

1.首先在访问变量的作用域中查找该变量,如果找到直接使用
2.如果没有找到,去上一级作用域中继续查找,如果如果找到直接使用
3.如果没有找到,继续去上一级作用域中继续查找,直到全局作用域
4.如果找到了就用,如果没有直到就报错

闭包

闭包是什么

一个封闭的对外不公开的包裹结构或空间

js中的闭包是函数

闭包要解决的问题

1、在函数外部访问不到函数内部的数据
2、要解决的问题就是需要在外部间接的访问函数内部的数据

闭包的基本结构

```js
function outer(){
    var data = "数据";
    return function(){
        return data;
    }
}
```

```js
function outer(){
    var data = "数据";
    var data1 = "数据1";
    return {
        getData:function(){
            return data;
        },
        getData1:function(){
            return data1;
        }
    }
}
```
```js
 function outer(){
        var data = "数据";
        return {
            getData:function(){
                return data;
            },
            setData:function(value){
                data = value;
                return data;
            }
        }
    }
```

闭包的作用

如果把数据放在全局作用域内,那么所有人都可以随意修改,这个数据就不再可靠。

闭包可以创建一个私有空间,在这个空间内部的数据,外部无法直接访问

外部空间想要访问函数内部的数据,只能通过闭包提供的指定的方法,在这个方法内部
可以设置一些校验规则,让数据变得更加的安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值