js中的作用域链、闭包

41 阅读1分钟

词法作用域

词法作用域就是指作用域是由代码中函数声明的位置来决定的,所以词法作用域是静态的作用域,通过它就能够预测代码在执行过程中如何查找标识符。

词法作用域是代码编译阶段就决定好的,和函数是怎么调用的没有关系。

作用域链

作用域链:通过作用域查找变量的链条称为作用域链;作用域链是由词法作用域决定的,而词法作用域反映了代码的结构

闭包

在 JavaScript 中,根据词法作用域的规则,内部函数总是可以访问外部函数中声明的变量,当通过调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。比如外部函数是 foo,那么这些变量的集合就称为 foo 函数的闭包。

function foo() {
	var myName = '极客时间'
	let test1 = 1
	const test2 = 2
	var innerBar = {
		getName: function () {
			console.log(test1)
			return myName
		},
		setName: function (newName) {
			myName = newName
		},
	}
	return innerBar
}
var bar = foo()
bar.setName('极客邦')
bar.getName()
console.log(bar.getName())

image.png

参考文档:浏览器工作原理与实践