闭包和作用域

先瞅一段代码

let  zipCode = (code,location)=>{
	let _code = code;
	let _location = location ||'';
	return {
		code(){
			return _code;
		},
		location(){
			return _location;
		}
	}
}

const printCode = zipCode('154545','144544');
console.log(printCode.code(),printCode.location())//154545,144544

这个玩具代码理解起来应该不是很难,这就是一个闭包
闭包从表现上来看,就是函数里面包含函数,里层函数访问外层函数的变量。本质上是一种能够在函数声明过程中将环境信息与所属函数绑定在一起的数据结构
在JavaScript的当中,闭包的作用一般如下:
1.模拟私有成员变量
2.从服务器获取数据以及创建快作用域变量
看下面代码

let outVar = '这是一个全局的变量';
let biBao = (params)=>{
	let innerVar = '这是内部作用域变量';
	let innerFnc = ()=>{
		console.log(`我能够获取到${outVar}${innerVar}还有父函数的参数${params}`);
	}
	return innerFnc;
}
let inner = biBao("一个小小的参数");
console.log(inner());

这段代码会打印出
“我能够获取到这是一个全局的变量和这是内部作用域变量还有父函数的参数一个小小的参数”
一般情况下而言,局部变量innerVar应该在biBao这个函数返回后进行了垃圾回收,从而并不存在,应该打印出undefined。但实际上并不会如此。从biBao中返回的函数会在其声明时记住其作用域内的所有变量,防止它被垃圾回收。
所以接下来聊JavaScript的三种类型的作用域
1.全局作用域
变量共享,但是应该尽量少的使用全局变量,以防发生命名冲突
2.函数作用域:在函数声明中的任何变量都是局部不可见的,同时在函数返回后,其声明的任何局部变量都会被删除,也就是被垃圾回收
JavaScript的作用域机制

  • 1.首先检查变量的函数作用
    2.如果没找到,那么逐层向外检查直到全局
    3.如果没有找到变量引用,那么返回undefined

3.伪块级作用域这个我就不多说了,有了es6标准变量声明尽量用let 常量用const

10-05 13:27