闭包是由于在词法作用下编写代码产生的,所以,讲到闭包必不可少的要说到词法作用。
词法作用域:
// 词法作用于
let a = '11'
function fn_2(){
let bgm_2 = '456'
fn_1()
console.log(bgm_2)
}
function fn_1(){
let bgm = '123'
console.log(bgm,'bgm')
}
fn_2()
// 输出结果
// 123 bgm
// 456
- 其中 a 的作用域是全局作用域,在全局的任何地方都可以访问到
- bgm 在fn_1 这个函数的作用中,bgm_2 在fn_2 的这个函数作用中,而fn_2的作用域包含发fn_1
总结
- 词法作用域是一种作用域工作模型,函数、块作用域在代码书写时就已经确定
- 其中eval,with 可以欺骗作用域。
闭包
- 一句话解释闭包:词法作用域的向上引用,用一个例子来说明一下
// 闭包
function test(){
let num = 1
function add(){
num++
console.log(num)
}
return add
}
let fn = test()
fn()
add这个函数始终保持着对test函数作用域的引用,这就是一个闭包
var fn
function foo() {
var a = 2
function baz() {
console.log(a)
}
fn = baz
}
foo()
fn()
- 这个也是闭包