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/

0 0