Swift51.com
麦子学院 头像
麦子学院  2017-05-13 13:14

javascript之闭包(closure)

回复:0  查看:2198  
本文和大家分享的主要是javascript 中闭包相关内容,一起来看看吧,希望对大家 学习javascript有所帮助。
  闭包就是拥有许多变量和绑定这些变量环境的表达式,因此这些变量也是该表达式的一部分。
  这个解释估计会有许多人懵了不懂,我们暂且理解为,闭包是一个函数表达式,表达式绑定了一些变量的环境,然后看下面的代码。
  function f1(){
  var n=999;
  function f2(){
  console.log(n);
  }
  return f2;// 返回内部函数供外部调用。
  }var result=f1();// 创建函数表达式, result 引用了 f2 函数,绑定变量 n 的环境。
  result();// 输出 999
   变量的作用域
  javascript 的变量分为两种,全局变量和局部变量,全局变量无法直接引用局部变量,局部变量可以直接引用全局变量,这就是作用域。闭包就是为了解决全局变量无法引用局部变量的问题。
  /**
  * 直接引用全局变量
  */var n=999;function f1(){
  alert(n);// 引用全局变量
  }
  f1(); // 999/**
  * 无法直接引用局部变量
  */function f2(){
  var abc=111;
  }
  alert(abc); // error
  闭包获取局部变量
  function f1(){
  var n=999;
  function f2(){
  console.log(n);
  }
  return f2;// 返回内部函数供外部调用。
  }var result=f1();
  result();// 输出 999
   闭包需要注意的问题
  闭包会将局部变量长期驻留在内存中,很可能会造成内存泄漏。这和java 的内存引用很相似,长生命周期的变量引用短生命周期的变量时,会促使垃圾回收器无法回收短生命周期的变量。
  function f1(){
  var n=999;
  nAdd=function(){n+=1}// 没有使用 var 修饰,实为申明全局变量。
  function f2(){
  alert(n);
  }
  return f2;
  }var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000 ,再次调用也可以获取到增后 n 的值,所以 n 没有被回收
   我们可以这么玩
  function f1(){
  var n=0;
  function f2(){
  n++;
  function f3(){
  n++;
  function f4(){
  n++;
  console.log(n);
  }
  return f4;
  }
  return f3;
  }
  return f2;
  }// 第一种调用方式
  f1()()()();//  输出  3// 第二种调用方式var result=f1()()();
  result();// 输出  3
  多连括号方式调用,即为将父函数返回的子函数立即调用。
  (function(){
  var n=0;
  console.log(n);
  })();// 输出  0// 也可以带有函数名
  (function f1(){
  var n=0;
  console.log(n);
  })();// 输出  0
  这个叫做  申明函数并立即执行。

来源: zengmianhui's personal blog