终于理解JS中的闭包了

之前看到一个观点是  闭包是走向高级Javascript的必经之路,之前看过很多关于闭包的讲解帖子,一直没有理解透彻,模棱两可。

现在终于可以讲出来了。

检验自己有没有掌握一个知识,最好的方式是讲给一个不懂的人 ,给Ta讲懂了。我做到了。

请有心读者检阅我的知识点有么有错误。

一:什么闭包

首先要理解 js特殊的作用域机制:只能按照作用域链向上访问,而不能访问Ta下级域中的变量。

闭包:就是能够读取其他函数内部变量的函数。 (*^__^*)

一切函数某种环境下都可以当做闭包。

手写一个demo:

function a(){

var s = 1;

function b(){

s++;

}

}

上述中   b函数就是一个闭包。

二:闭包的用途:

   1.可以读取函数内部的变量   2  使这些变量保存在内存中

举栗子:

var li = document.getElementsByTagName("li");
    for(var i=0;i<5;i++){
         li[i].onclick = function(){
         alert(i);
    }
}

这样运行结果是:每次弹出5;   原因是:当点击alert  i的值为最后运算完的值。

修改方法一:

匿名函数自调用;

var li = document.getElementsByTagName("li");
for(var i=0;i<5;i++){
      (function(arg){
          li[i].onclick = function(){
            alert(arg);
         }
      })(i);
}

-----------------分割线  -------------------

将变量 i 保存给在每个段落对象(p)上

?


1

2

3

4

5

6

7

8

9

function init() {  

 var pAry = document.getElementsByTagName("p");  

 for( var i=0; i<pAry.length; i++ ) {  

   pAry[i].i = i;  

   pAry[i].onclick = function() {  

    alert(this.i);  

   }  

 }  

}  

2、将变量 i 保存在匿名函数自身

?


1

2

3

4

5

6

7

8

function init2() {  

 var pAry = document.getElementsByTagName("p");  

 for( var i=0; i<pAry.length; i++ ) {   

  (pAry[i].onclick = function() {  

    alert(arguments.callee.i);  

  }).i = i;  

 }  

}

3、加一层闭包,i以函数参数形式传递给内层函数

?


1

2

3

4

5

6

7

8

9

10

function init3() {  

 var pAry = document.getElementsByTagName("p");  

 for( var i=0; i<pAry.length; i++ ) {  

  (function(arg){    

    pAry[i].onclick = function() {    

     alert(arg);  

    };  

  })(i);//调用时参数  

 }  

}  

4、加一层闭包,i以局部变量形式传递给内存函数

?


1

2

3

4

5

6

7

8

9

10

11

function init4() {  

 var pAry = document.getElementsByTagName("p");  

 for( var i=0; i<pAry.length; i++ ) {   

  (function () {  

   var temp = i;//调用时局部变量  

   pAry[i].onclick = function() {   

    alert(temp);   

   }  

  })();  

 }  

}  

5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

?


1

2

3

4

5

6

7

8

9

10

function init5() {  

 var pAry = document.getElementsByTagName("p");  

 for( var i=0; i<pAry.length; i++ ) {   

  pAry[i].onclick = function(arg) {  

    return function() {//返回一个函数  

    alert(arg);  

   }  

  }(i);  

 }  

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

?


1

2

3

4

5

6

function init6() {  

  var pAry = document.getElementsByTagName("p");  

  for( var i=0; i<pAry.length; i++ ) {   

   pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例 

  }  

7、用Function实现,注意与6的区别

?


1

2

3

4

5

6

function init7() {  

  var pAry = document.getElementsByTagName("p");  

  for( var i=0; i<pAry.length; i++ ) {  

     pAry[i].onclick = Function(‘alert(‘+i+‘)‘

  }  

}

时间: 2024-10-26 15:35:16

终于理解JS中的闭包了的相关文章

理解js中的闭包

首先我们先来看一段代码: <a href="javascript:void(0);">111</a> <a href="javascript:void(0);">222</a> <a href="javacsript:void(0);">333</a> var a=document.getElementsByTagName("a"); function b

java程序员理解js中的闭包

1.闭包概念: 就是函数内部通过某种方式访问一个函数内部的局部变量 2.Java中的类似操作 public class Demo{ private static String a; public static String getA(){ return a; } } Demo demo=new Demo(); //在这里需要访问demo中的a属性怎么办? demo.a;//会报错 demo.getA();//可以 3.javaScript中的操作 function Demo(){ var a=1

javascript理解js中的闭包

在javascript中变量有其作用域,如果在函数内部var一个变量,那么在函数外部一般情况下是不能被引用的. function outerFun() { var a =0; alert(a); } var a=4; outerFun(); alert(a); 结果是 0,4 .  因为在函数内部使用了var关键字 维护a的作用域在outFun()内部. 闭包的作用就是使用变通的方法来访问函数内部的局部变量. 参照下面的例子和输出结果: function outFun() { var aa =

js中的闭包之我理解

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能

js中的闭包理解

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能

js中的闭包理解一

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能

理解js中的作用域以及初探闭包

前言 对于js中的闭包,无论是老司机还是小白,我想,见得不能再多了,然而有时三言两语却很难说得明白,反正在我初学时是这样的,脑子里虽有概念,但是却道不出个所以然来,在面试中经常会被用来吊自己的胃口,考察基础,虽然网上自己也看过不少相关闭包的文章,帖子,但貌似这玩意,越看越复杂,满满逼格高,生涉难懂的专业词汇常常把自己带到沟里去了,越看越迷糊,其实终归结底,用杨绛先生的一句话就是:"你的问题在于代码写得太少,书读得不够多",其实在我看来前者是主要的,是后者的检验, 自知目标搬砖20年(还

(转)js中的闭包问题

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能

转载 - 读博客 - 笔记 - JS中的闭包(closure)

原博客标题:JS中的闭包(closure)原博客地址:http://www.cnblogs.com/jingwhale/p/4574792.html 笔记如下: 1. 函数内部声明变量的时候,一定要使用var命令.如果不用的话,实际上是声明了一个全局变量. function outer(){ localVal = 30; return localVal; } outer(); alert(localVal);//30 2. Javascript语言特有的“链式作用域”结构(chain scope