闭包

函数的作用域是其定义时候的,而不是执行时候的作用域;
1.函数作为返回值
 1 function F1(){
 2      var a=100
 3      //F1返回一个函数作为返回值
 4     return function(){
 5     console.log(a)
 6      }
 7  }
 8  var fn=F1();  
 9   //执行F1函数,返回一个函数赋给fn;
10  a=200;
11  fn() //执行返回的函数
12  //a是自由变量,执行第10行时,打印第6行,a为自由变量,则在其函数定义的作用域找其值,即返回的函数作用域里面(4-6行),没有找到;则在其定义作用域的父作用域(1-7行)找a的值,其值为100,则第10行执行结果为100

2.函数作为参数传递

  function F1(){
      var a=100
      //F1返回一个函数作为返回值
     return function(){
     console.log(a)
      }
  }
  var fn=F1()
function F2(fm){
  var a=200
  fm()
 }
F2(fn) //fn在其定义的父作用域找a的值,而不是执行域,所以结果仍为100
  
 
原文地址:https://www.cnblogs.com/sunmarvell/p/8666876.html