JavaScript中闭包函数的理解和应用
什么是闭包函数
“ 闭”的概念:闭函数指的是该函数是内嵌函数;
“包”的概念:包函数指的是该函数包含对外层函数作用域名字的引用(注意:不是对全局的作用域,只是局部的作用域)
闭包函数:名称空间于作用域的应用+函数的嵌套,它是一种能访问其他函数的作用域中变量(局部变量)的语法。
"闭包"函数的作用与创建
1、作用:
(1)可以在函数的外部访问函数内部的变量。
(2)可以让变量的值始终保存在内存。
注意:滥用’闭包’对程序的执行效率会产生很大的影响。
2、创建:在一个函数的内部创建另外一个函数。另外一个函数可以访问该函数的局部变量。
function func(){
var title = '学习JavaScript';
function infunc(){
console.log(title)
}
return infunc;
}
var func1 = func();
func1();//学习JavaScript
在这个例子中我们可以看到在函数infunc
中可以访问到func
中的局部变量title
。子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。既然infunc
可以读取func
中的局部变量,那么只要把infunc
作为返回值,就可以在func
外部读取它的内部变量了。
闭包函数的应用
模拟类的私有属性
利用闭包的性质,局部变量num只在Person构造方法中才可以访问,而name在外部也能访问,从而实现了类的私有属性。
var Person = (function(){
var num = 0;
function Person(name){
num++;
this.name = name;
console.log('No.'+num+'user name is'+this.name)
}
return Person;
})();
var uesr1 = new Person('Mr li');//No.1user name isMr li
var uesr2 = new Person('xiao ming');//No.2user name isxiao ming
console.log(uesr1.name);//Mr li
console.log(uesr1.num);//undefined
console.log(uesr2.name);//xiao ming
console.log(uesr2.num);//undefined
总结
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域。
闭包有3个特性。
(1)函数嵌套函数。
(2)在函数内部可以引用外部的参数和变量。
(3)参数和变量不会以垃圾回收机制回收。