js 中的闭包

闭包:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式是 在一个函数内部创建另一个函数
        (从定义上讲 js 中所有的函数都是闭包)

function a(){
    var i=0;
    function b(){
      alert(++i);
    }
    return b;
}
var c=a();
c();

以上代码的特点:

  1、函数b嵌套在函数a内部;
      2、函数a返回函数b。
       当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
            闭包就是函数或代码块执行完后不回收a中占用的资源,因为a的内部函数的执行需要依赖a中的变量
            PS:全局环境的变量对象始终存在,像函数中的局部环境变量,则只在函数执行的过程中存在
            作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。

PS: 由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过渡使用闭包可能会导致内存占用过多
            所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的用处:

  a.读取函数内部的变量。

b.让这些变量的值始终保持在内存中。

使用闭包的注意点
  1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,
      否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

  2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,
      把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),
      这时一定要小心,不要随便改变父函数内部变量的值。

闭包容易造成的问题:  

function a(){
  var result = new Array();
  for (var i=0; i < 10; i++){
    result[i] = function(num){
      return function(){
        return num;
      };
    }(i); //若此处不传入 i值 运行代码后 获取的值 都是 10
  }
  return result;
}
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
alert(object.getNameFunc()()); //"The Window"(在非严格模式下)

object.getNameFunc()  执行后 返回的是一个函数  后面的括号又运行了该函数 相当于该函数是在全局环境中运行的。

在全局环境中this 默认指向的是window对象

所以函数里面的this.name  就是全局的变量name

解决办法:

我们知道,闭包的一个作用就是读取函数内部的变量。

如果要获取本来的对象 可以将本来的this 保存在另一个自定义的变量中 然后将该变量传入返回的函数里面。

这样该变量就会一直保存在内存中 不会被销毁

时间: 2024-08-02 16:20:08

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中的闭包理解一

闭包是一个比较抽象的概念,尤其是对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

js中的闭包和c#中的闭包

我们 关于闭包,一个老僧长谈的话题:js的闭包俺将的比较多了,而且很详细,俺就不说了,可以看看之前的文章: 我们来对比一下c#中的闭包和js中的闭包: 先看我们的c#代码: static List<Action> fn0() { int result = 0; List<Action> list = new List<Action>(); for (int i = 0; i < 10; i++) { result = i + 1; //这样result相当于一个全

浅谈JS中的闭包

今天 大年初一,祝各位小伙伴们狗年旺旺啊,闲来也没事,只能钻研一下自己的分内之事,也就是作为一个前端码农的身份,得时刻保持学习的态度,温故而知新,每天都给自己一个小目标去完成,日积月累,所想达到的状态,都会有所见长. JS中的闭包,想必,做web开发的程序猿们都有一定的认识吧,不仅仅是js里有这种特性,而且弱语言类型的譬如python里也是有闭包这么一个强大的特性的,对于老司机们来说,闭包可真的是一个很好的东西,但是对于新入门的菜鸟们来说,闭包却是一个难以搞得清楚的特性,很多情况下,会用,但是却

通俗易懂地解释JS中的闭包

1. "闭包就是跨作用域访问变量." [示例一] ? 1 2 3 4 5 6 7 8 9 var name = 'wangxi' function user () {  // var name = 'wangxi'  function getName () {  console.log(name)  }  getName() } user() // wangxi 在 getName 函数中获取 name,首先在 getName 函数的作用域中查找 name,未找到,进而在 user 函

详解js中的闭包

前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式,深入讲解一下对于闭包的理解,如果有不对请指正. 写在闭包之前 闭包的内部细节,依赖于函数被调用过程所发生的一系列事件为基础,所以有必要先弄清楚以下几个概念: 1. 执行环境和活动对象 ** - 执行环境(execution context)定义了变量或者函数有权访问的其他数据,每个执行环境都有一个与之关联的

js中的闭包

对于没有接触过闭包的初学者来说,很难见名知义马上理解什么是闭包.所以首先我们要明确一下什么是闭包.我们先来看一下官方对于闭包的解释:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.看了这个官方的解释,大家对于闭包理解了吗?反正当我看到这个解释的时候是一脸蒙逼,不知道这说的是些什么鬼.因为看到这个解释我很难把闭包和我平时在js中进行的一些操作联系到一起更谈不上学会应用闭包了.可以说闭包是js中的一个难点,难就难在它很