美文网首页
闭包概念的理解

闭包概念的理解

作者: 李华炎 | 来源:发表于2018-04-06 17:45 被阅读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()());

相关文章

  • JS闭包理解

    闭包的概念 闭包就是能够读取其他函数内部变量的函数。 一、变量的作用域 要理解闭包,首先必须理解Javascrip...

  • Kotlin闭包

    闭包的概念 闭包(Closure)的概念总是存在于各种支持函数式编程的语言中。首先理解什么是闭包,这里取JavaS...

  • Kotlin闭包

    闭包的概念 闭包(Closure)的概念总是存在于各种支持函数式编程的语言中。首先理解什么是闭包,这里取JavaS...

  • 闭包概念的理解

    闭包的概念 今天就和大家说一下什么是闭包,在javascript中闭包的应用非常广泛,就看你能不能get到其中的重...

  • JavaScript 作用域闭包

    作用域闭包 启示 对于那些有一点 JavaScript 使用经验但未真正理解闭包概念的人来说,理解闭包可以看作是某...

  • javascript

    var getAuthor = (function (){ 今天我们来谈谈闭包的概念和理解。闭包设计的理念也...

  • 自动闭包/逃逸闭包/非逃逸闭包

    自动闭包、逃逸闭包和非逃逸闭包三个概念有些不好理解,这里按我自己的理解总结一下,不对的地方请指正 一、非逃逸闭包:...

  • JavaScript闭包深解

    闭包算是javascript中一个比较难理解的概念,想要深入理解闭包的原理,首先需要搞清楚其他几个概念: 一、栈内...

  • 理解闭包

    理解闭包 1.闭包概念(出自JavaScript高级程序设计)闭包是指有权访问另一个函数作用域中的变量的函数主谓宾...

  • 闭包

    概念:闭包是函数和声明该函数的词法环境的组合。 对于闭包的定义大都比较抽象,而我的理解是:闭包就是能够读取其他函数...

网友评论

      本文标题:闭包概念的理解

      本文链接:https://www.haomeiwen.com/subject/tqushftx.html