本文共 1165 字,大约阅读时间需要 3 分钟。
答案:
简单理解就是函数中嵌套函数。我们都知道局部变量我们是无法访问的,但是通过闭包可以做到。
// 正常访问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()); //1console.log(myConstructor.counter); //underfined
转载地址:http://jjuvi.baihongyu.com/