js闭包面试题经典

通过这个例题可以来考察一个人是不是真的理解了闭包:

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

闭包