您的位置:首页 > Web前端 > JavaScript

javascript浅谈闭包

2016-06-14 14:58 423 查看
突然有朋友说,可以写一下闭包的问题,其实闭包对于新手来说可能稍微复杂点,但是对于一个js的高级玩家来说,就是最简单不过的事情了,今天咱们就来搞下闭包。

js作用域

在我们讨论闭包前,肯定要说一下js中关于作用域的问题,在大多数语言当中,好像都有这个作用域的概念,作用域无非就两种,一个是局部变量,一个是全局变量。

局部变量就是可以在某块特定的区域内才可以访问的变量,比如函数内部的变量就是局部变量。

全局变量就是随时随地都可以访问的变量,比如window对象和node的global对象就是全局变量。

javascript是一门很神奇的语言,在函数的内部可以随便访问全部变量。

看代码:

var n = 100;
function func(){
alert(n);
}
func();


这样执行会弹出100;

function func(){
var n = 100;
}
func();
alert(n);


这样执行就会报错,为什么呢,就是因为n是局部变量,只有在func中有效,在外部是无效的,外部的n是undefined,所以在外面alert(n)的时候就会报错。ok,很好理解。

有一个需要注意的地方就是,在函数内部声明变量时,一定要用var来声明局部变量,不然就会声明为全局变量,像下面的代码:

function func(){
n=100;
}
func();
alert(n);


这样搞的话,就会完全没问题的弹窗100。

js闭包

ok,说了这么多了,终于到正题了,js的闭包的产生就是由于js的作用域的问题所产生的额。对于js的作用域,咱们有一个什么问题呢,就是当咱们在全局想访问局部的函数内部的变量时,我们应该怎么搞呢???

ok,这就有了闭包的概念,闭包就是干这个得。看下面的代码:

function func(){
var n = 100;
function func2(){
alert(n);
}
func2();
}
func();


ok ,执行上面的代码,照样会输出100,但是咱们如果想在外面访问到n怎么搞呢??看下面的代码:

function func(){
var n = 100;
function func2(){
alert(n);
}
return func2;
}
var result = func();
result();


ok ,看到了什么情况,输出了100,是的,没毛病。

所谓闭包呢,简单来讲就是定义在函数内部的函数返回。所以,闭包,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的作用

1.希望一个变量长期驻扎在内存当中

2.避免全局变量的污染

3.私有成员的存在

练习

其实咱们讲的已经很简单了,咱们来练习一下吧:

function f1(){
var a = 0;
addA = function(){
a++;
};
function f2(){
alert(a);
}
return f2();
}
f2();


ok ,大家猜下运行结果是什么??答案不告诉你,很简单,如果这都错了,说明你确实该好好学习下了。

再来一个吧:

function fun1(){
a = 0;
alert(a);
}
var a = 1;
fun1();
alert(a);


这个得输出呢???

再来一个:

function fun(){
alert(b);
var b = 10;
}
fun();
alert(b);


运行下看看答案,理解了,才是硬道理。

总结:

理解JavaScript的闭包是迈向高级JS程序员的必经之路,理解了其解释和运行机制才能写出更为安全和优雅的代码。但是不要刻意使用闭包,不要为了闭包而闭包,应该是按代码设计来,按编程思路走,lol
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息