闭包应用的两种情况即可——函数作为返回值,函数作为参数传递。
闭包:函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性称为闭包。
//函数作为返回值 输出15
function fn(){
var max = 10;
return function bar(x){
if(x > max){
console.log(x);
}
};
}
var f1 = fn();
f1(15);
//执行f1(15)时,用到了fn作用域下的max变量的值
//函数作为参数被传递 输出15
var max=10;
var fn = function(x){
if(x > max){
console.log(x);
}
};
(function(f){
var max = 100;
f(15);
})(fn);
//fn函数作为一个参数被传递进入另一个函数,执行f(15)时,max变量的取值是10,而不是100
自由变量作用域:输出 10
要到创建这个函数的那个作用域中取值——是“定义”,而不是“调用”,切记切记——其实这就是所谓的“静态作用域”。
var x = 10;
function fn(){
console.log(x);
}
function show(f){
var x = 20;
(function(){
f();
})();
}
show(fn);
- 找到 x = fn() ,调用fn,函数返回值为函数bar ,bar中a +b,a不在bar函数作用域中,在创建/定义bar()的作用域找a,没有,继续在创建fn()的作用域中找,存在a = 10;b不在bar作用域中,在定义bar()的作用域(即fn())中查找 ,找到b=20,输出 a+b=30.
var a= 10;
function fn(){
var b = 20;
function bar(){
console.log(a + b);
}
return bar;
}
var x = fn(),b=200;
x();