javascript闭包运行原理,javascript中的闭包是什么意思

  javascript闭包运行原理,javascript中的闭包是什么意思

  闭包是Javascript语言的难点,也是它的特点。许多高级应用程序依赖于闭包。

  下面是我的学习笔记,对Javascript初学者应该很有用。

  首先,变量的范围

  要理解闭包,我们必须首先理解Javascript的特殊变量作用域。

  变量只有两个范围:全局变量和局部变量。

  Javascript的特殊之处在于可以在函数内部直接读取全局变量。

  var n=999

  函数f1(){

  警报(n);

  }

  f1();//999

  另一方面,在函数外部读取函数内部的局部变量自然是不可能的。

  函数f1(){

  var n=999

  }

  警报(n);//错误

  这里有一点要注意。在函数内部声明变量时,必须使用var命令。如果你不使用它,你实际上声明了一个全局变量!

  函数f1(){

  n=999

  }

  f1();

  警报(n);//999

  二、如何从外部读取局部变量?

  由于各种原因,我们有时需要在函数中获取局部变量。但是,如前所述,正常情况下,这是不可能的,只能通过变通方法来实现。

  也就是在函数内部定义另一个函数。

  函数f1(){

  var n=999

  函数f2(){

  警报(n);//999

  }

  }

  在上面的代码中,函数f2包含在函数f1中,f1中的所有局部变量对f2都是可见的。但反之则不然。f2内部的局部变量对f1是不可见的。这是Javascript语言特有的‘链作用域’结构,子对象会一层一层的查找父对象的所有变量。因此,父对象的所有变量对于子对象都是可见的,反之亦然。

  由于f2可以读取f1中的局部变量,所以我们只要把f2作为返回值就可以读取它在f1之外的内部变量!

  函数f1(){

  var n=999

  函数f2(){

  警报(n);

  }

  返回F2;

  }

  var result=f1();

  结果();//999

  第三,封闭的概念

  前面代码中的f2函数是闭包。

  各种专业文献中对‘封闭’的定义非常抽象,难以理解。我的理解是闭包是一个可以读取其他函数内部变量的函数。

  在Javascript语言中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单理解为‘函数内部定义的函数’。

  所以,本质上,闭包是连接函数内部和外部的桥梁。

  第四,使用闭包

  闭包可以用在很多地方。它最大的用途有两个,一个是可以读取前面提到的函数内部的变量,另一个是将这些变量的值一直保存在内存中。

  这句话怎么理解?请看下面的代码。

  函数f1(){

  var n=999

  nAdd=函数(){n=1}

  函数f2(){

  警报(n);

  }

  返回F2;

  }

  var result=f1();

  结果();//999

  nAdd();

  结果();//1000

  在这段代码中,result实际上是闭包的f2函数。它运行两次,第一次的值是999,第二次的值是1000。这证明函数f1中的局部变量N一直保存在内存中,并没有在调用f1后自动清除。

  为什么会这样?原因是f1是f2的父函数,f2被赋给了一个全局变量,导致f2一直在内存中,f2的存在依赖于f1,所以f1一直在内存中,调用结束后不会被垃圾回收收集。

  这段代码中另一个值得注意的地方是“nAdd=function(){n=1}”行。首先,在nAdd之前没有使用var关键字,所以nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数,匿名函数本身也是一个闭包,所以nAdd相当于一个setter,可以在函数外部操作函数内部的局部变量。

  动词(verb的缩写)使用闭包时的注意事项

  1)因为闭包会把函数中的变量保存在内存中,消耗大量内存,所以不能滥用闭包。否则会造成网页性能问题,可能导致IE内存泄露。解决方法是在退出函数之前删除所有未使用的局部变量。

  2)闭包会在父函数之外,改变父函数内部的变量值。所以,如果你把父函数作为对象,闭包作为它的公共方法,内部变量作为它的私有值,注意不要随意改变父函数内部变量的值。

  六、思考问题

  如果你能理解下面两段代码的运行结果,你就应该理解闭包的运行机制了。

  代码片段一。

  var name= The Window

  var object={

  名称:“我的对象”,

  getNameFunc : function(){

  返回函数(){

  返回this.name

  };

  }

  };

  alert(object . getname func()());

  代码片段2。

  var name= The Window

  var object={

  名称:“我的对象”,

  getNameFunc : function(){

  var that=this

  返回函数(){

  返回那个. name;

  };

  }

  };

  alert(object . getname func()());

  (完)

  来自:http://www . Ruan Yifeng . com/blog/2009/08/learning _ JavaScript _ closes . html

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: