javascript浅谈闭包
2016-06-14 14:58
423 查看
突然有朋友说,可以写一下闭包的问题,其实闭包对于新手来说可能稍微复杂点,但是对于一个js的高级玩家来说,就是最简单不过的事情了,今天咱们就来搞下闭包。
局部变量就是可以在某块特定的区域内才可以访问的变量,比如函数内部的变量就是局部变量。
全局变量就是随时随地都可以访问的变量,比如window对象和node的global对象就是全局变量。
javascript是一门很神奇的语言,在函数的内部可以随便访问全部变量。
看代码:
这样执行会弹出100;
这样执行就会报错,为什么呢,就是因为n是局部变量,只有在func中有效,在外部是无效的,外部的n是undefined,所以在外面alert(n)的时候就会报错。ok,很好理解。
有一个需要注意的地方就是,在函数内部声明变量时,一定要用var来声明局部变量,不然就会声明为全局变量,像下面的代码:
这样搞的话,就会完全没问题的弹窗100。
ok,这就有了闭包的概念,闭包就是干这个得。看下面的代码:
ok ,执行上面的代码,照样会输出100,但是咱们如果想在外面访问到n怎么搞呢??看下面的代码:
ok ,看到了什么情况,输出了100,是的,没毛病。
所谓闭包呢,简单来讲就是定义在函数内部的函数返回。所以,闭包,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
2.避免全局变量的污染
3.私有成员的存在
ok ,大家猜下运行结果是什么??答案不告诉你,很简单,如果这都错了,说明你确实该好好学习下了。
再来一个吧:
这个得输出呢???
再来一个:
运行下看看答案,理解了,才是硬道理。
总结:
理解JavaScript的闭包是迈向高级JS程序员的必经之路,理解了其解释和运行机制才能写出更为安全和优雅的代码。但是不要刻意使用闭包,不要为了闭包而闭包,应该是按代码设计来,按编程思路走,lol
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
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- 深入理解PHP之匿名函数
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子