zoukankan      html  css  js  c++  java
  • JavaScript 闭包

    JavaScript 语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

    所谓闭包就是说,一个函数能够访问其函数外部作用域中的变量,即指有权访问另一个函数作用域中的变量的函数。而创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。

    闭包的作用在于,可以通过闭包,设计私有变量及方法

    闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

    案例一:

    function outer(a){
      var x = 1;
      function inner(y) {
        console.log(x+y);
      }
      return inner;
    }
    var  i= outer(3); //其实i内部储存的是inner函数的地址。因为outer() 返回了inner,所以其实i=inner(); 
    
    i(5); //result: 6  这里就会使用局部变量,打印出a;本层虽没有a的定义,但是在innner的作用域链存在,所以输出1
    
    outer(3)(5); //result: 6  这里是把上面两步合并了一下输出。
    
    inner(); //但是这样调用,是不能成功的,会报错。

    案例二:

    function outer(){
      var x = 1;
      function inner() {
        return x++;
      }
      return inner;
    }
    var  x= outer(); 
    
    console.log(x()); //result: 1
    console.log(x()); //result: 2
    console.log(x()); //result: 3

    为什么是1,2,3呢?因为函数的闭包,记住了定义时所在的作用域,这个作用域中的变量不是一成不变的。

    案例三:

    function outer(){
      var x = 1;
      function inner() {
        return x++;
      }
      return inner;
    }
    var  x= outer(); 
    var y = outer();
    
    console.log(x()); //result: 1
    console.log(y()); //result: 1
    console.log(x()); //result: 2
    console.log(y()); //result: 2

    这里又为什么结果是这样呢?因为 x和y其实是两个不同的对象,相互之间不影响。 每次调用一个函数,都会产生新的闭包。新的闭包,语句全新,所处环境也是全新的。

  • 相关阅读:
    SPOJ SAMER08A
    SPOJ TRAFFICN
    CS Academy Set Subtraction
    CS Academy Bad Triplet
    CF Round 432 C. Five Dimensional Points
    CF Round 432 B. Arpa and an exam about geometry
    SPOJ INVCNT
    CS Academy Palindromic Tree
    身体训练
    简单瞎搞题
  • 原文地址:https://www.cnblogs.com/ningxin/p/10109077.html
Copyright © 2011-2022 走看看