JS闭包
来源:互联网 发布:js中换行符\n和br 编辑:程序博客网 时间:2024/06/08 06:08
哇哇哇!!!这个东西是真的烦,概念我记不住,应用还广泛,说是很重要,可能我还比较菜鸡,不能了解这其中的精髓,但是今个肯定要把这东西搞明白,反正从今天起,要每一天都有收获才行。
先写一下概念:
闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成”定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
还记得我上次说,我在面试的时候,面试大哥问我JS闭包,我给他写了个这:
function f1(){var a=1;function f2(){var a=2;console.log(a);}}f2(a);//2
他和我说这这能调用吗,我还在那里瞎哔哔,硬说可以,我想他一定他感觉我是神经病吧。
**
这个当然不可以!!!!!!!!!!!
**
语法都不对。。。我也是服了自己。
我错了..实际上,我的理解就是:当function里嵌套function时,内部的function可以访问外部function里的变量。
这个理解是片面而又大众话的,我觉得不太明白,而又明白一点的人都有过这样的结论吧。
今天也看了好几个帖子,看到一个博主他是google了一下,看的别人的总结起来,他帖子上这样写的:
//帖子
function foo(x) { var tmp = 3; function bar(y) { alert(x + y + (++tmp)); } bar(10);}foo(2);
不管执行多少次,都会alert 16,因为bar能访问foo的参数x,也能访问foo的变量tmp。
//帖子结束
我一开始虽然并不明白,为什么说是都会输出16,但是后面的的话算是看懂了,说是内部函数,可以访问两个变量,一个是外部函数的传入的参数,另一个是外部函数的变量。这样就不可以。
实际上,我此刻也只是看明白说,这样不可以。但是为什么呢?
//他的解释
但,这还不是闭包。当你return的是内部function时,就是一个闭包。内部function会close-over外部function的变量直到内部function结束。
就是说要把内部函数的值返回出来,而不是直接调用它。
那如果想要使他成为闭包呢?
function foo(x) { var tmp = 3; return function (y) { alert(x + y + (++tmp)); }}var bar = foo(2); // bar 现在是一个闭包bar(10);
//他的解释
上面的脚本最终也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar还是能访问x和tmp。
但是,由于tmp仍存在于bar闭包的内部,所以它还是会自加1,而且你每次调用bar时它都会自加1.
看到这里我就基本明白了,闭包,就是函数内部返回一个函数的值,该值是访问了父函数变量得到的,就会形成闭包。
然而啪啪啪,博主给了一个不用return的例子:
function closureExample(objID, text, timedelay) { setTimeout(function() { document.getElementById(objID).innerHTML = text; }, timedelay); } closureExample(‘myDiv’, ‘Closure is created’, 500);
?????
这个会形成闭包吗?我没懂,博主没有解释,难过,先放下吧。
//博主的
JS里的function能访问它们的:
1. 参数
2. 局部变量或函数
3. 外部变量(环境变量?),包括
3.1 全局变量,包括DOM。
3.2 外部函数的变量或函数。
如果一个函数访问了它的外部变量,那么它就是一个闭包。
啊? 然后他帖子上又说:从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据。
我擦嘞~~~666
他的最后结语:
(1)闭包是一种设计原则,它通过分析上下文,来简化用户的调用,让用户在不知晓的情况下,达到他的目的;
(2)网上主流的对闭包剖析的文章实际上是和闭包原则反向而驰的,如果需要知道闭包细节才能用好的话,这个闭包是设计失败的;
(3)尽量少学习。
我黑人问号了。疑问疑问疑问
好了,今天就大致了解了JS闭包了。
参考链接:http://kb.cnblogs.com/page/110782/
- js闭包示例
- JS 闭包 计数器
- js闭包
- js 闭包
- js闭包
- js闭包
- js闭包
- js 闭包
- js 闭包
- js闭包
- js闭包
- (function (){})(); JS 闭包
- JS 闭包应用
- js闭包
- JS闭包
- JS 闭包随笔
- js闭包
- js 闭包
- session.invalidate();详细解释
- 【LeetCode】 328. Odd Even Linked List C语言
- Java类加载器总结
- HTTP 方法:GET 对比 POST
- LDA(生)
- JS闭包
- weatherdemo
- ionic和ionic2 环境下编写自定义cordova插件
- 常用软件环境变量的配置
- codeforces 678C Joty and Chocolate
- MFC新手入门之总结篇
- maven构建项目
- 破解前端面试
- 离散数学关系部分错题