闭包-

112 阅读1分钟

闭包是由于在词法作用下编写代码产生的,所以,讲到闭包必不可少的要说到词法作用。

词法作用域:

// 词法作用于
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()
  • 这个也是闭包