JavaScript函数闭包

2019-07-13115次阅读javascript

闭包的定义

《JavaScript高级程序设计》:

闭包是指有权访问另一个函数作用域中的变量的函数

《JavaScript权威指南》:

从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链

《你不知道的JavaScript》

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

 

创建一个闭包

function foo(){
    var a = 2;
    return function fn(){
        console.log(a);
    }
}

let func = foo();
func();//输出2


闭包使得函数可以继续访问定义时的词法作用域。拜 fn 所赐,在 foo() 执行后,foo 内部作用域不会被销毁。

 

闭包的作用

能够访问函数定义时所在的词法作用域(阻止其被回收)。

私有化变量

function base(){
    let x = 10;//私有变量
    return {
        getX:function(){
            return x;
        }
    }
}


模拟块级作用域

var a = [];
for(var i = 0; i < 10;i++){

    a[i] = (function(j){

        return function(){
            console.log(j);
        }

    })(i);

}

a[6]();


创建模块

function coolModule(){
    let name = 'xinran001';
    let age = 20;
    function sayName(){
        console.log(name);
    }
    function sayAag(){
        console.log(age);
    }

    return{
        sayName,
        sayAag
    }
}

let info = coolModule();
info.sayName();//xinran001

 

  • 模块模式具有两个必备的条件(来自《你不知道的JavaScript》)
  • 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)
  • 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态。
上一篇: 防抖函数与节流函数的区别  下一篇: flex属性实战解读  

JavaScript函数闭包相关文章