在线咨询
QQ咨询
服务热线
服务热线:13125520620
TOP

《前端之路》之四 JavaScript 的闭包、作用域、作用域链

发布时间:2018-7-16 浏览:3066

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 对象的全局作用域。
 
然后这一条条的 作用域链 就形成了一整条关联的链条。
四、具体案例的分析:
 
这里 我们举了一个栗子 ??
 
eg1:
 
function Person(name) {
    this.name = name
    this.getName = function() {
        return this.name
    }
}
 
var one = new Person('zhang')
one.getName() // zhang
one.name      // zhang
 
var two = new Person('wang')
two.getName() // wang
one.name      // wang
eg2:
 
function Person(name) {
    var _name = name
    this.getName = function() {
        return _name
    }
 
var one = new Person('zhang')
one.getName() // zhang
 
var two = new Person('wang')
two.getName() // wang
eg1 vs eg2
 
这二个例子进行对比,虽然 都拿到了自己想要的 name 但是 eg1 的方式会比 eg2 获取 name 
的方式要多一个, 即为 作为对象的属性来 获取到 当前的 name (one.name)
那如果 你想让你的 name 属性只能通过 getName 方法来获取,不希望有别的方法来获取 甚至是改变的话,那么 闭包 设置私有属性就是一个很安全的做法,那么这个时候闭包的作用就体现出来了。
 
 

TAG
软件定制,软件开发,瀚森HANSEN
0
该内容对我有帮助