怎么去理解JavaScript中的闭包原理
序言
今天搭建好了自己的博客,以前是觉得写博客没什么用(还是太年轻了!!!),其实并不然,它可以让你当时很好的去理解某一个知识点,并且组织语言写出来,惠及他人,后面回过头再看你自己写的代码,可以从中找出相应的不足(我想应该是很多程序猿的心声)。废话不多说了,这几天在写插件的过程中遇到了闭包的问题,比以前初学时理解的更深刻了,下面进入我们今天的主题,怎么去理解JavaScript中的闭包原理
。
什么是闭包,怎么去理解它
闭包,官方的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分,这样的解释,肯定是理解起来比较晦涩难懂的。
大家都知道js作用域有两种,局部和全局
,在作用域中访问的顺序是由内向外的,内部的作用域可以访问当前作用域和包含当前作用域的外层变量,那么相反就不能了,那么闭包的作用就体现出来了,就是一个函数内部有权限去访问另外一个函数内部的变量,更通俗一点就是函数中的函数,并在外可以访问
,主要体现3点:
- 闭包的外层是函数,内部也是函数
- 闭包内部会return一个函数
- 执行闭包后,闭包的内部变量会存在,闭包内部函数的内部变量会回收
举例让你更加的明白什么是闭包
function man() {
var str = "hello world!"
function woman() {
console.log(str);
}
return woman;
}
var person = man();
person(); // hello world!
看到上面的例子,是不是大脑里已经把闭包的画面过了一遍,总结上面的一句话就是函数man里面有一个函数woman被函数man外的变量person引用
。
function man() {
var money = 1;
function woman() {
var num = 0;
console.log(++num);
console.log(++money);
}
return woman;
}
var person = man();
person(); // 1 2
person(); // 1 3
看上面这个例子,是一个比较经典的闭包例子,一般情况下在执行完man函数,里面的变量应该是被销毁的,但是woman函数作为man的函数给了person,就相当于执行了woman函数,并且woman函数引用了man函数的变量money,所以无法被销毁,而num每次被调用,都是num = 0,所以就产生了内存的消耗。
var person = function(){
//变量作用域为函数内部,外部无法访问
var name = "one";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();
console.log(person.name);//直接访问,结果为undefined
console.log(person.getName());//one
console.log(person.setName("two")); //undefined
console.log(person.getName());//two
看到上面的例子,是对闭包的优化,可能其他的都好理解,就第三个结果为什么是undefined,你们看setName函数,里面是没有return的。
闭包的好处以及合理使用闭包
显而易见,闭包会保护函数内的变量安全,实现封装,防止与其他的变量名发生冲突,合理的使用闭包,防止消耗了内存,第二个例子,被引用的变量不能被销毁,增大了内存的消耗,造成内存的遗漏,浏览器性能问题等。
总结
大家看了应该对闭包有所理解了吧,文字信息和例子相结合,应该很快会明白什么是闭包,自己可以动动手,写写,应该会更深刻的了解闭包的含义,如果有什么错误,请告知,谢谢!
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 JsOcean的博客!