Skip to the content.

闭包定义

YDKJS:闭包就是函数能够记住并访问它的词法作用域。(即使当这个函数在它的词法作用域之外执行时)

JavaScript语言精粹:函数可以访问它被创建时所处的上下文环境。

JavaScript高级程序设计:有权访问另一个作用域中变量的函数。

MDN:Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions ‘remember’ the environment in which they were created.

// first 应用词法作用域链的例子
function foo() {
	var a = 'foo'
  function bar () {
  	console.info(a)
  }
  bar()
}
foo()

// first- 应用词法作用域链的另外的例子
function _foo () {
	var a = '_foo'
  function bar (b) {
  	console.info(b)
  }
  bar(a)
}
_foo()

// second 应用词法作用域的例子
function fee(a) {
	function bar () {
  	console.info(a)
  }
  bar()
}
fee('fee')

// second- 应用词法作用域另外的例子
function _fee(a) {
	function bar(b) {
  	console.info(b)
  }
  bar(a)
}
_fee('_fee')

// third 闭包的例子
function fff(a) {
	return function bar () {
  	console.info(a)
  }
}
fff('fff')()

// third- 另外的闭包的例子
function _fff() {
	const a = '_fff'
  return function bar () {
  	console.info(a)
  }
}
_fff()()

// third- 糟糕的错误例子
// function _fff(a) {
//	(function(b) {
//  	return function bar() {
//    	console.info(b)
//   }
//   })(a)
// }
// _fff('_fff')()

// forth
function fgg() {
	let a = 'fgg'
  function bar (b) {
  	a += b
  	console.info(a)
  }
  return {
  	concat: function () {
    	bar('_concat')
    },
    splice: function () {
    	bar('_splice')
    }
  }
}
fgg().concat()
fgg().splice()
const $fgg = fgg()
$fgg.concat()
$fgg.splice()