资讯专栏INFORMATION COLUMN

javascript---闭包

stormgens / 846人阅读

摘要:要理解闭包,首先必须理解特殊的变量作用域。使用闭包有一个优点,也是它的缺点就是可以把局部变量驻留在内存中,可以避免使用全局变量。

js闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现, 这种方法就是闭包。

    function box() {
    var user = "Lee";
    return function () { //通过匿名函数返回 box()局部变量
    return user;
    };
    }
    alert(box()()); //通过box()()来直接调用匿名函数返回值
    var b = box();
    alert(b()); 

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。。

使用闭包有一个优点,也是它的缺点:就是可以把局部变量驻留在内存中,可以避免使用全局变量。(全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难,所以推荐使用私有的,封装的局部变量)

js闭包---var vs let

有一个比较有意思的事情就是 ES6推出的let congst之后引发的一场血案, ^_^这场血案需要格外注意

下面来看两段代码, 其中唯一的区别就是 for 循环中 i 变量的关键字前者为 var 后者为 let, 两者都是用了闭包的概念

    function box() {
      var arr = [];
      for (let i = 0; i < 5; i++) {
        arr[i] = function () {
        return i;
        };
      }
      return arr;
    }
    let b = box(); //得到函数数组
    for (let i = 0; i < b.length; i++) {
      console.log(b[i]()); //输出每个函数的值,都是最后一个值
    }
    //运行结果
    // 0
    // 1
    // 2
    // 3
    // 4
    function box() {
      let arr = [];
      for (let i = 0; i < 5; i++) {
        arr[i] = function () {
        return i;
        };
      }
      return arr;
    }
    let b = box(); //得到函数数组
    for (let i = 0; i < b.length; i++) {
      console.log(b[i]()); //输出每个函数的值,都是最后一个值
    }
    //运行结果
    // 0
    // 1
    // 2
    // 3
    // 4

这里设计了作用域的问题, 更涉及了 var 和 let 在 for 循环中条件表达式中的与其他高级语言的不同, 除了 var 不存在块级作用域 let 存在代码块作用域这一说不加详细介绍,最关键的是如果条件语句中用 let 则在每次循环的初期都会生成一个变量-(这与 c 语言, java 不同) ,而 var 只会在访问初期调用一次生成一个变量, 这个是js最新出现的闭包相关的易错点.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107239.html

相关文章

  • Javascript闭包入门(译文)

    摘要:也许最好的理解是闭包总是在进入某个函数的时候被创建,而局部变量是被加入到这个闭包中。在函数内部的函数的内部声明函数是可以的可以获得不止一个层级的闭包。 前言 总括 :这篇文章使用有效的javascript代码向程序员们解释了闭包,大牛和功能型程序员请自行忽略。 译者 :文章写在2006年,可直到翻译的21小时之前作者还在完善这篇文章,在Stackoverflow的How do Java...

    Fourierr 评论0 收藏0
  • 理解Javascript闭包

    摘要:但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。可惜的是,并没有提供相关的成员和方法来访问闭包中的局部变量。 (收藏自 技术狂) 前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将...

    dayday_up 评论0 收藏0
  • JavaScript闭包,只学这篇就够了

    摘要:当在中调用匿名函数时,它们用的都是同一个闭包,而且在这个闭包中使用了和的当前值的值为因为循环已经结束,的值为。最好将闭包当作是一个函数的入口创建的,而局部变量是被添加进这个闭包的。 闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透闭包的含义。 其实只要理解了核心概念,闭包并不是那么的难于理解。但是,网上充斥了太多学术性的文章,对于...

    CoderBear 评论0 收藏0
  • JavaScript深入之闭包

    摘要:深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。定义对闭包的定义为闭包是指那些能够访问自由变量的函数。 JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也...

    caige 评论0 收藏0
  • 还担心面试官问闭包

    摘要:一言以蔽之,闭包,你就得掌握。当函数记住并访问所在的词法作用域,闭包就产生了。所以闭包才会得以实现。从技术上讲,这就是闭包。执行后,他的内部作用域并不会消失,函数依然保持有作用域的闭包。 网上总结闭包的文章已经烂大街了,不敢说笔者这篇文章多么多么xxx,只是个人理解总结。各位看官瞅瞅就好,大神还希望多多指正。此篇文章总结与《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 评论0 收藏0
  • [学习笔记] JavaScript 闭包

    摘要:但是,必须强调,闭包是一个运行期概念。通过原型链可以实现继承,而与闭包相关的就是作用域链。常理来说,一个函数执行完毕,其执行环境的作用域链会被销毁。所以此时,的作用域链虽然销毁了,但是其活动对象仍在内存中。 学习Javascript闭包(Closure)javascript的闭包JavaScript 闭包深入理解(closure)理解 Javascript 的闭包JavaScript ...

    sunsmell 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<