通过这个例题可以来考察一个人是不是真的理解了闭包:
function F1() { var a = 100 return function () { console.log(a) } } var f1 = F1() var a = 200 f1()
这题问你,以上代码输出结果是多少?是100还是200?
答案是:100。
我们要得到自由变量a的值,是顺着作用域链找的,但是依据的是函数定义时的作用域链,而不是函数执行时。
那个var a = 200就是来干扰你的判断的。
闭包主要有两个应用场景:
1.函数作为返回值
2.函数作为参数传递
函数作为返回值,就是上面那个例子。函数F1 return 了一个函数。
函数作为参数传递,请参见下面这段代码:
function F1() { var a = 100 return function() { console.log(a) } } function F2(f1) { var a = 200 f1() } var f1 = F1() F2(f1) // 100