答案:
简单理解就是函数中嵌套函数。我们都知道局部变量我们是无法访问的,但是通过闭包可以做到。
// 正常访问
var lan = 'zh';
function hello(){
var name = '前端';
}
console.log(name) //很明显'undefined'
// 换成闭包
function hello(){
var name = '前端';
function demo(){
console.log(name) //打印:前端
}
}
详细解析:
Javascript 在函数外部自然无法读取函数内的局部变量。
function f1() {
var n=999;
}
alert(n); // error
需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,实际上声明了一个全局变量!
闭包:指有权访问另一个函数作用域中的变量的函数。
理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。
在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的优缺点:
优点(闭包的作用):
-
① 在函数执行完后,函数内部的变量一直存在于内存中,不会在调用结束后被垃圾回收机制回收;
-
② 函数外部也可以读取到函数内部的变量;
缺点:
由于闭包会使用函数中的变量存在在内存中,内存消耗很大,所以不能滥用闭包;
解决的办法是:退出函数之前,将不使用的局部变量删除;
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」,实现私有化。依据软件设计中的最小特权原则,应该最小限度的暴露必要内容,而将其他内容都隐藏起来。在编写面向对象的JS代码中,是无法使用传统的私有变量的,即无法让对象的属性保持对外隐藏。但是通过使用闭包就可以创建私有变量。
在这个例子中,不能直接访问私有变量counter,只能通过存取的方式获取私有变量的值。
function MyConstructor(){
var counter = 0;
this.getCounter = function(){
return counter;
}
this.addCounter = function(){
counter++;
}
}
var myConstructor = new MyConstructor();
myConstructor.addCounter();
console.log(myConstructor.getCounter()); //1
console.log(myConstructor.counter); //underfined
本文详细解析了JavaScript中闭包的概念,包括如何通过闭包访问函数内的局部变量,闭包的优缺点,以及如何利用闭包实现变量的私有化。通过实例展示了闭包在实际编程中的应用。
1万+

被折叠的 条评论
为什么被折叠?



