JS-闭包面试题
1. question-1
- 什么是闭包?
- 闭包就是一个函数和它周围状态的引用捆绑在一起的组合。
- 题目(函数作为返回值)
js
function test() {
const a = 1
return function () {
console.log('a', a)
}
}
const fn = test()
const a = 2
fn()
- 答案:
logs: a 1
,因为返回值函数当中的a
,按照作用域链[[../原型链/JS-作用域链]],具有3个变量对象。- 匿名函数本身的变量对象
- 其父级函数
test
的变量对象
- 其父级函数
- 全局的变量对象
const
和let
类似,本质上从属于块级作用域,因此,test
内部的const a
和全局的const a
本质上是两个变量,调用fn
的时候,访问的上下文环境,是test
函数返回的匿名函数的上下文环境,因此,输出的a
为1
2. question-2
- 题目(函数作为参数)
js
function test(fn) {
const a = 1
fn()
}
const a = 2
function fn() {
console.log('a', a)
}
- 输出结果为2
- 因为
fn
函数的上下文环境,是其被定义时的上下文环境,而非被执行时的上下文环境。