在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
闭包是纯函数式编程语言的传统特性之一。通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流JavaScript库以及高水平产品代码中日益流行起来。 一、变量的作用域在介绍闭包之前,我们先理解JavaScript的变量作用域。变量的作用域分为两种:全局变量和局部变量。 1、全局变量var n = 999; //全局变量 function f1() { a = 100; //在这里a也是全局变量 alert(n); } console.log(a); //100 在这里,函数内外部可以直接取到变量的值——全局变量 2、局部变量//局部变量 function f2() { var b = 22; } console.log(b); //报错 在这里,函数外部无法直接取到函数内部定义的值——局部变量 讲到这里,当我们想要从外部取到局部变量的值,这时候该怎么办呢? 二、如何从外部获取局部变量接下来我们看一个例子: var outer = 'Outer'; // 全局变量 var copy; function outerFn(){ // 全局函数 var inner = 'Inner'; // 该变量只有函数作用域,无法从外部访问 function innerFn(){ // outerFn()中的innerFn() // 全局上下文和外围上下文都可以在这里使用, // 因此可以访问到outer和inner console.log(outer); console.log(inner); } copy=innerFn; // 保存innerFn()的引用 // 因为copy是在全局上下文中声明的,所以在外部可以使用 } outerFn(); copy(); // 不能直接调用innerFn(),但是可以通过在全局作用域中声明的变量来调用 来分析一下上面的例子。在innerFn()中可以访问变量outer,因为它处于全局上下文中。 在执行完outerFn()之后,执行了innerFn(),这是通过将该函数的引用复制到一个全局变量 这就是JavaScript的链式作用域结构,子对象会一级一级的向上寻找所有父对象的变量。所以父对象的所有变量对子对象都是可见的,反之则不成立。 这样我们就可以获取到函数内部的局部变量了。 三、闭包的概念上面代码块中的copy()函数就是闭包。在我的理解,闭包就是能够读取到函数内部变量的函数。 四、闭包的作用在我看来,闭包的作用主要体现在两个方面: 1、可以读取函数内部的变量这个作用在上个代码块已经表现得很清楚。 2、可以将局部变量的值一直保存在内存中总所周知,局部变量只有当使用的时候才会在内存中开辟出暂时的存储空间,在函数运行结束后会自动释放空间。而闭包的出现可以使得局部变量可以像全局变量一样一致存储在内存中。 function c1() { var z = 9999; nAdd = function() { z += 1; } function c2() { console.log(z); } return c2; } var result = c1(); result(); //9999 nAdd(); result(); //10000 在上述代码中,先执行一次c1(),此时z=9999;再执行一次nAdd(),使z+1;在执行一次c1()输出此时z的值,z=10000。说明z的值一直存储在内存中,并没有在第一次调用c1()后背自动消除。 此时就要注意,闭包的使用会消耗很大的内存,不要滥用闭包。在退出函数之前,将不使用的局部变量全部删除。 到此这篇关于详解JavaScript闭包问题的文章就介绍到这了,更多相关JavaScript闭包问题内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论