闭包概念的理解

2018-04-06  本文已影响0人  李华炎

闭包的概念

今天就和大家说一下什么是闭包,在javascript中闭包的应用非常广泛,就看你能不能get到其中的重点。通过相关资料的阅读和整理,总结了闭包的概念如下:

概念:简单地说,闭包就是在函数的内部声明的函数(即可理解为闭包就是innerFn函数)。

闭包本质:闭包的本质就是可以让函数(innerFn)外部作用域访问到在函数(innerFn)声明时所在作用域中的所有变量以及其他函数。闭包是将函数内部和函数外部链接起来的桥梁。

var globalVariable = '我是全局变量';

function outerFn () {   // 外部函数
    var localVariable = '我是局部变量';

    return function innerFn () {  // 内部函数
        console.log(globalVariable);
        console.log(localVariable);
    }
}

// 外部作用域中不能访问内部作用域中的变量
// console.log(localVariable); // 错误

var ref = outerFn(); // 将闭包的引用赋值给ref,即在内存中会保存定义innerFn时的作用域
ref();

闭包的作用

  1. 在函数外读取函数内部的变量
  2. 变量的值始终保持在内存中
// 证明内部变量一直存在内存中
// 在全局作用域中定义f1
function f1 () {    // 外部函数
    var count = 100;
    addOne = function () {
        count += 1;
    }
    return function f2 () {  // 内部函数
        console.log(count);
    }
}

var refe = f1();
refe();     // 100  (这一步证明了在函数外读取函数内部的变量count)
addOne();   // 调用全局变量addOne使count加1,如果变量count不存在内存中就会报count is not defined(证明了变量的值始终保持在内存中)
refe();     // 在原来的值上加1就证明变量一直存在内存中

闭包的注意事项

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

练习

// 案例1
var name = "The Window";

var object = {
    name : "My Object",

    getNameFunc : function(){
        return function(){
            return that.name;
        };

    }

};

// 问输出什么?
console.log(object.getNameFunc()());
// 案例2
var name = "The Window";

var object = {
    name : "My Object",

    getNameFunc : function(){
        var that = this;
        return function(){
            return that.name;
        };
    }
};

// 问输出什么?
console.log(object.getNameFunc()());
上一篇 下一篇

猜你喜欢

热点阅读