函数的作用域是其定义时候的,而不是执行时候的作用域;
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