04:JavaScript 的闭包

一、定义:

常规定义:

闭包的定义: 有权利访问外部函数作用域的函数。

通俗定义:

1、函数内部包含了函数。然后内部函数可以访问外部函数的作用域。
2、内部函数可以访问 父级函数的作用域。
...等等等
二、思考:
1、我们在日常的开发过程中会应用到 闭包么?
2、如果有遇到的话,会是在什么情况下遇到的?
3、举一些 具体的例子。

1、我们在日常的开发过程中会应用到 闭包么?

以之前的知识对于 闭包的理解来讲是这样的

    (function(){
        for(var i=0; i<10; i++) {
            console.log(i)
        }
    })()
    
或者说是这样的

    var fnX = function() {
        var x = 123
        function y() {
            alert(x)
        }
        y()
    }

    fnX()   // 123

总结下之前的理解就是: 内部函数能访问外部函数作用域,能够保存变量不被销毁而一直存在。

三、作用:

在JavaScript中有作用域和执行环境的问题,在函数内部的变量在函数外部是无法访问的,在函数内部却可以得到全局变量。由于种种原因,我们有时候需要得到函数内部的变量,可是用常规方法是得不到的,这时我们就可以创建一个闭包,用来在外部访问这个变量。

通过将一个方法或者属性声明为私用的,可以让对象的实现细节对其他对象保密以降低对象之间的耦合程度,可以保持数据的完整性并对其修改方式加以约束,这样可以是代码更可靠,更易于调试。封装是面向对象的设计的基石。

3.1 什么是作用域
3.1.1 ES5的作用域问题
在 ES5 中 我们常常会说的一个概念是 局部变量 和 全局变量

那么 局部变量 和 全局变量 所存在的环境则为 作用域。
3.1.2 ES6的作用域问题
在 ES6 中 出现了块级作用域的概念

let const 在() 内则 ()内的作用域 为 块级作用域。
3.2 什么是执行环境
执行环境 即为 当前作用域内的环境。
3.3 什么是作用域链
这个概念其实 也是比较虚的概念,不太好理解。但是一旦理解就不会忘记了。

所谓 链 其实就是链条, 将需要链接在一起的东西链接在一起(感觉说了一句废话)

作用域链的通俗理解:

在函数内部作用域 通过 作用域链 可以访问 函数外部作用域 的属性或者方法。

一层层的 作用域链 往外走  到最后 则为 window 对象的全局作用域。

然后这一条条的 作用域链 就形成了一整条关联的链条。
四、具体案例的分析:

这里 我们举了一个栗子

版权声明:本文为erbingbing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/erbingbing/p/9320050.html