js闭包

JavaScript闭包(closure)

什么是闭包呢?
在了解闭包之前,我们应该先具体在了解一下JavaScript的两种变量作用域,一个是全局作用域(全局变量),另一个是函数作用域(局部变量)

var n=111;
function f1(){
	console.log(n);
}
fi();//111

这个便是全局变量,在函数内部都是可以直接读取全局变量

function f2(){
	var a=222;
}
console.log(a); //Uncaught ReferenceError: a is not defined

但是我们在函数内部声明的变量却无法在函数外部显示出来,这时我们就需要去思考其他的方式,将函数内部声明的变量在函数外部表现出来,因为引出闭包的概念,看下面这段代码

function f1(){
	var a=222;
	function f2(){
		console.log(a);
	}
	return f2();
}
f1();//222

此时我们在函数的内部又设置了一个方法f2(),输出函数内部变量的值,但此时若在f2()中声明变量,在f1()中是不可见的,这就是JavaScript语言特有的“链式作用域“结构(chain scope)
既然f2可以读取f1的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
闭包就是我们所讲的f2,能够读取其他函数内部变量的函数。
闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。闭包的另一个用处,是封装对象的私有属性和私有方法。

function person(name){
	var age;
	function setAge(n){
		age=n;
	}
	function getAge(){
		return age;
	}
	return (
		name:name,
		setAge:setAge,
		getAge:getAge);
}
var p1=person("张三");
p1.setAge(21);
p1.getAge();//21
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页