zoukankan      html  css  js  c++  java
  • js闭包简要分析

      相信大多数接触过js编程的程序员或多或少都对js中的闭包了解一些吧,所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包是 ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下。如果想要扬长避短地使用闭包这一特性,则必须了解它们的工作机制。而闭包工作机制的实现很大程度上有赖于标识符(或者说对象属性)解析过程中作用域的角色。 

         下面我举一个简单的函数执行来说明闭包的工作原理:

    我们所熟知的主流语言,像C,java等,在函数内部只要执行了return,函数就会返回结果,然后内存中删除该函数所在的区域.生命周期也就停止了.一般的js函数也是这样.
    但是有闭包特性的js函数有点特殊.
    就例子来说:
    function a(){
    var i=0;
    function b(){
    alert(++i);
    }
    return b;
    }
    var c = a();
    c();

    这是个标准的闭包.在函数a中定义了函数b,a又return了b的值.这些可以先不管.
    var c = a();
    c();
    这两句执行很重要.
    在var c = a();这行里,执行了a函数,那么肯定a经过了return.按照主流语言的函数特性,现在c的值就是a的返回值.
    第二行c()的执行实际执行的就是b函数.最后不管执行的是谁,会弹出一个值为0的窗口,到此为止,所有的生命周期按理论来说就算全部结束了.
    可是,如果我们再多执行一行.
    var c = a();
    c();
    c();
    第一次弹出0,第二次执行却弹出了1.

    也就是说,第一次c()后,a中的i依然保留.自然a在内存的栈区依然保留.

    a是return过了,但是,a及内部值却依然存在,这就是闭包.
    在一般的程序中,我们使用闭包主要是为了一个变量的使用,在一个函数的作用域里面定义的变量,不会影响到后面的变量,但是这个方法却可以进行调用这个变量的值,主要的作用就是保护了函数的安全性。
    以上便是一个简单的js函数闭包的列子。
  • 相关阅读:
    Java第十三天,内部类
    Java第十二天,权限修饰符
    Java面向对象基础
    opencv配置(win10+VS2015+opencv3.1)
    malloc函数
    C++用new创建对象和不用new创建对象的区别解析
    字符串匹配KMP算法中Next[]数组和Nextval[]数组求法
    C++将一个数组内容赋给另一个数组
    C++中的const和指针组合
    通过图片对比带给你不一样的KMP算法体验
  • 原文地址:https://www.cnblogs.com/lanveer/p/4104614.html
Copyright © 2011-2022 走看看