首页前端开发HTMLJavascript闭包篇

Javascript闭包篇

时间2024-05-20 00:36:03发布访客分类HTML浏览130
导读:一、闭包的概念 In computer science, a closure is a function that is evaluated in an environment containing one or more bound v...

一、闭包的概念

In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When called, the function can access these variables.

闭包是个函数,而它"记住了周围发生了什么"。表现为由"一个函数"体中定义了"另一个函数"

"闭包"是一个表达式(一般是函数),它具有自由变量以及绑定这些变量的环境(该环境"封闭了"这个表达式)。(闭包,就是封闭了外部函数作用域中变量的内部函数。但是,如果外部函数不返回这个内部函数,闭包的特性无法显现。如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包。此时,闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放。)

闭包就是能够读取其他函数内部变量的函数。

闭包是有权访问另一个函数作用域中的变量的函数。

闭包是javascript中很难理解的部分,很多高级的应用都依靠闭包来实现的。要理解闭包,首先要理解变理的作用域,见Javascript变量作用域篇。可以先不用仔细理解前面关于闭包的定义。可以先接着向下看,看完后再回头看前面的定义有助于对闭包的理解。我们先来看下面的一个例子:

function outer() {
     var i = 100;
 function inner() {
     console.log(i);
 }
}
    

上面代码,根据变量的作用域,函数outer中所有的局部变量,对函数inner都是可见的;函数inner中的局部变量,在函数inner外是不可见的,所以在函数inner外是无法读取函数inner的局部变量的。

既然函数inner可以读取函数outer的局部变量,那么只要将inner作为返会值,就可以直接在ouer外部读取inner的局部变量。

function outer() {
     var i = 100;
 function inner() {
     console.log(i);
 }
     return inner;
}
    var rs = outer();
    rs();
    

这个函数有两个特点:

  1. 函数inner嵌套在函数ouer内部;
  2. 函数outer返回函数inner。

这样执行完var rs = outer()后,实际rs指向了函数inner。这段代码其实就是一个闭包。也就是说当函数outer内的函数inner被函数outer外的一个变量引用的时候,就创建了一个闭包。

二、闭包的作用

function outer() {
     var i = 100;
 function inner() {
     console.log(i++);
 }
     return inner;
}
    var rs = outer();
    rs();
     //100rs();
     //101rs();
     //102

上面的代码中,rs是闭包inner函数。rs共运行了三次,第一次100,第二次101,第三次102,这说明在函数outer中的局部变量i一直保存在内存中,并没有在调用自动清除。

闭包的作用就是在outer执行完毕并返回后,闭包使javascript的垃圾回收机制(grabage collection)不会回收outer所占的内存,因为outer的内部函数inner的执行要依赖outer中的变量。(另一种解释:outer是inner的父函数,inner被赋给了一个全局变量,导致inner会一直在内存中,而inner的存在依赖于outer,因些outer也始终于在内存中,不会在调用结束后被垃圾收集回收)。

  1. 闭包有权访问函数内部的所有变量。
  2. 当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

三、闭包与变量

由于作用域链的机制,闭包只能取得包含函数中任何变量的最后一个值。看下面例子:

function f() {
     var rs = [];
     for (var i=0;
     i 

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Javascript闭包篇
本文地址: https://pptw.com/jishu/663791.html
mac下的编辑神器vim配置 Javascript变量作用域

游客 回复需填写必要信息