zoukankan      html  css  js  c++  java
  • 面试中的一些小问题之闭包的简单理解

    闭包,官方解释:一个拥有许多变量和绑定了这些变量的环境的表达式,通常是一个函数,因而这些变量也是该表达式的一部分。

    抽象,难以理解,再普通一点来说,就是函数返回函数。

    找一个最简单的例子:

    function a(i) {
            function b(j) {
                return i+j;
            }
            return b;
        }
    
        var add = a(1);
        alert(add(5));
    

    执行的结果是弹出6;

    变量add中存放的是函数b,因为再函数a中返回值为b,并且b没有加括号。

    add的内容是:

     function b(j) {
                return i+j;
            }

    原始的代码中先定义了一个a函数,在a函数中又定义了一个b函数,并且在b函数中使用了a函数中的i这个参数,然后调用了a(1),让add引用了a函数中返回的内嵌函数b,a(1)的功能是将一个数字加1,这这时又调用了add(5),相当于已经绑定了变量i,并且将i的值赋值为了1,之后调用了add(5),即将变量j赋值为5,执行之后就是1+5,所以add(5)的结果就是6.

    所以Js中闭包的产生条件:

    1. 嵌入函数使用了外部函数的局部变量;
    2. 外部函数引用了内嵌函数;

    上面的例子中,嵌入函数b使用了局部变量i,外部函数a引用了内嵌函数b;

    但是,如果内嵌函数中没有使用外部函数的局部变量,那么就没有必要绑定定义时环境中的变量,浏览器也是这样实现的,再者,如果外部变量没有引用内嵌函数,则内嵌函数被垃圾回收,形成的闭包也会无法使用。所以需要看一下闭包实现的原理。

    Js闭包中绑定定义时环境中的变量是通过js的函数作用域链实现的,要理解闭包的原理,先要理解js函数的作用域链。因为我自己学的还不是很深,对于闭包的原理理解的也还不够,所以只能写一点简单的用法,和自己的一点理解,这也是参照了一些前辈的经验总结出来的。

    另外在Js闭包的应用方面,主要是多用来封装和保存现场。

    • 封装是因为闭包绑定的变量只能供自己使用,对外部是隐藏的;
    • 保存现场是因为保存的是定义时的变量,可以通过闭包保存定义时的现场,方便后面使用。
    做Web前端的代码猴
  • 相关阅读:
    云计算和SOA何时走到了一起?
    MVP
    Mvp
    Technology Radar of thoughtworks
    JSF
    我们要积极学习互联网的用户体验
    Gwt
    数字的字符串处理
    C语言字符串函数大全(转自百度百科)
    树状数组
  • 原文地址:https://www.cnblogs.com/wang-bo/p/7207226.html
Copyright © 2011-2022 走看看