`
maxm
  • 浏览: 3907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

js闭包的典型应用场景

阅读更多
1. 保护函数的内部变量安全
2. 在内存中维持一个变量,防止被GC

  
 
   function a(){
     var i=0;
     function b(){
       var j=i; //只要是引用了 i 的。
        alert(j);
     }
     return b;
   }

   var c=a(); //a 执行完了,但由于' c();' 的原因 a 的内部变量不会被回收
   c(); //通过c 调用 b 来访问 i (维持 i)
   






分享到:
评论
11 楼 argont 2011-01-02  
在我的理解认为:

闭包是为了引用变量更方便、减少全局变量

少用较好,以免内存溢出。
10 楼 takuma888 2011-01-01  
maxm 写道
1. 保护函数的内部变量安全
2. 在内存中维持一个变量,防止被GC

  
 
   function a(){
     var i=0;
     function b(){
       var j=i; //只要是引用了 i 的。
        alert(j);
     }
     return b;
   }

   var c=a(); //a 执行完了,但由于' c();' 的原因 a 的内部变量不会被回收
   c(); //通过c 调用 b 来访问 i (维持 i)
   




楼主的说法有两个小问题。
引用
在内存中维持一个变量,防止被GC

应该是维持函数调用时产生的闭包,防止被GC。维持的是一个闭包对象(一般指执行时上下文),而不是某个变量。

引用
var j=i; //只要是引用了 i 的。

在这里只是赋值,不是引用。也不是因为赋值或引用,闭包才得以保持。
即使没有var j=i;,把下面的alert(j)改为alert(i),也能使闭包不被GC。
实际上,即使没有alert(i),闭包也是不被回收的。
*这里的闭包指的是var c = a();时,调用a所产生的执行时上下文。

每个执行时上下文都有自己的作用域链,用于标识符解析。当执行时上下文被创建时,它的作用域链初始化为当前运行函数的[[scope]]内部属性中所包含的对象。执行时上下文被创建的同时也创建了活动对象,其包含了所有局部变量,命名参数,参数集合,函数声明等。然后这个活动对象被推入作用域链的顶端,为标识符解析服务。

当执行例子中的function a时,function b作为活动对象中的函数声明,其作用域链将包含a的执行时活动对象,就是我们常说的闭包。此时的b又被return到外部,有了外部引用,只要存在外部引用,处在b的作用域链中的a的执行时活动对象将一直存在,不被GC。

至此闭包就被保留了,被保留的原因不是被赋值或被引用,也不是通过c调用b才能维持,调用c只是使用了闭包,不是维持闭包的原因。

  
 
   function a(){
     var i = 100;
     function b(str){
        alert(eval(str));
     }
     return b;
   }

   var c = a(); //a执行后,返回时并没有引用i,闭包依然会被保存。
   c('i'); //仍然能访问闭包。
   
9 楼 semmy 2010-12-30  
sudongyuan 写道
我在很多方面都很菜
胆怯的问一句,GC是啥?

垃圾回收,JS引擎有这个功能的,不过没有Java的垃圾回收强大而已。
8 楼 sudongyuan 2010-12-30  
我在很多方面都很菜
胆怯的问一句,GC是啥?
7 楼 aoliwen521 2010-01-19  
我这方面很菜。。
胆怯的问一下,难道js也有GC??
6 楼 pf_miles 2010-01-19  
楼主没说清楚到底是什么应用场景...
“闭包”在编程语言中的意思就是一个函数的所有变量(未列在参数中的变量加上列在参数中的变量)都被绑定并且不可再改变;
那么这个绑定的变量来自于哪里?这是个很重要的问题;
楼主的例子,自由变量是i,i的值是函数内部写死的...其实这算不上“闭包的应用场景”,楼主的例子与以下代码无异:
var c = {'i':0};

闭包其实类似于一个简单的匿名对象,如果仅仅是写死的绑定变量,那么还不如真的去创造一个匿名对象;

但当这些自由变量并非写死,且需要各自变化时,闭包的作用就体现了出来,举个例子:
<input type='button' id='b1'/>
<input type='button' id='b2'/>
<input type='button' id='b3'/>

上面3个button,功能一样——每当被点击,就alert出自己目前为止一共被点击了多少次;
那么这个记录点击次数的变量放在哪里?这3个button的功能完全一样,事件函数可以写成一个,但却需要分别设立变量来存储自己被点击了多少次,那么这个时候闭包的作用就来了:把他们的事件监听函数设置为同一个函数的闭包,这样一来3个button的点击次数就独立变化了,且没有全局变量产生;
就像下面这样的代码:
function genCount(){
    var i = 0;
    return function(){
        i++;
        alert(i);
    }
}
var a = genCount();
var b = genCount();
a();
b();
b();
b();
a();

应该输出1,1,2,3,2,也就是说a和b中的i独立变化
5 楼 xiongfhvk 2010-01-19  
感谢楼上的,学习了。。。
4 楼 yesir 2010-01-19  
闭包的秘密
http://www.gracecode.com/archives/2385/
这篇文章有个PPT讲的得清楚啦。

闭包的作用

1、setTimeout/setInterval
2、回调函数(callback)
3、事件句柄(event handle)

有兴趣的朋友看完可以讨论一下~
3 楼 coreymylife 2010-01-19  
感觉主要还是避免了全局变量和减少了传参,mark一下!
2 楼 lixinlixin2008 2010-01-18  
顶二楼,这样的好处是啥?为了更容易内存泄漏吗
1 楼 lost_alien 2010-01-18  
2. 在内存中维持一个变量,防止被GC

这样的好处是啥呢?

相关推荐

    JS闭包可被利用的常见场景

    以下将详细介绍两个常见场景中闭包的应用。 场景一:采用函数引用方式的 `setTimeout` 调用 在Web开发中,`setTimeout` 用于延迟执行函数。然而,`setTimeout` 的第一个参数需要是函数的引用,而不是带参数的函数...

    JavaScript闭包研究及典型应用.pdf

    本文将介绍 JavaScript 闭包的定义、使用场景和典型应用。 闭包函数的定义和使用场景 在 JavaScript 语言中,闭包函数是指在函数顶层可定义函数,即函数可以嵌套的。简单地说,闭包也就是内层函数可以引用存在于...

    js闭包个人理解

    这段代码展示了闭包的一个典型应用场景。函数`a`内部定义了一个变量`i`和另一个函数`b`。函数`b`被设计为返回变量`i`的值加1,并通过`alert`将其显示出来。最后,`a`函数返回`b`函数本身。 当我们执行`var c = a();...

    详谈JavaScript的闭包及应用

    在实际开发中,闭包的典型应用场景包括: 1. 创建私有变量和私有方法,以保护内部状态和封装代码逻辑。 2. 确保变量的封装性和数据的隐藏,仅通过公共接口与外界交互,如使用getter和setter方法。 3. 实现模块模式,...

    一套基于纯js实现的JavaScript典型应用技巧例子源码

    本套源码集合是一系列基于纯JavaScript实现的典型应用技巧实例,旨在帮助开发者深入理解和掌握JavaScript的核心特性和实战技能。以下是这些源码所涵盖的一些关键知识点: 1. **基础语法**:JavaScript的基础包括...

    Javascript典型应用例程(源程序)

    JavaScript,作为一种广泛应用于Web开发的脚本语言,其在网页交互、数据处理、动画效果等方面具有丰富的应用场景。这个"JavaScript典型应用例程(源程序)"的压缩包显然为初学者提供了一个深入理解JavaScript语言的...

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    每次调用 `counter()` 时,`count` 的值都会增加,这就是闭包的一个典型应用场景。 ##### 1.4 闭包的主要实现形式 闭包可以通过以下几种方式实现: 1. **函数作为返回值**:如上例所示,内部函数作为外部函数的...

    JavaScript基础篇(6)之函数表达式闭包

    闭包的典型应用场景包括模块化编程、私有变量和方法的封装等。例如,可以利用闭包实现一个计数器,每次调用返回一个递增的值。 ```javascript function counter() { var count = 0; return function() { return ...

    javascript 闭包详解及简单实例应用

    JavaScript闭包是该语言一个非常重要的概念,它是理解高级JavaScript特性的基础。闭包允许一个函数访问并操作函数外部的变量,这样即使外部函数已经执行完毕,内部函数仍然可以访问外部函数的作用域。下面,我们将...

    JavaScript 中的闭包是指内部函数可以访问外部函数作用域中的变量

    闭包在JavaScript中有着广泛的应用,下面列举了一些典型的应用场景: 1. **封装私有变量和方法** 闭包可以用来创建模块化的代码结构,通过隐藏变量和方法来避免全局命名空间的污染,并提高代码的可维护性和可读性...

    JavaScript 闭包详细介绍

    闭包的一个典型应用场景是,一个函数返回另一个函数。例如,一个创建比较函数的函数`createComparisonFunction`返回一个匿名函数,该匿名函数可以访问`createComparisonFunction`的参数`propertyName`,这样就形成了...

    Javascript的闭包详解

    闭包的一个典型应用场景是工厂函数,它可以根据不同的参数创建具有特定状态的函数实例。工厂函数通常会返回一个内部定义的函数,这个内部函数会记住工厂函数的参数状态,并在后续调用中使用这些状态。 虽然闭包在...

    JavaScript闭包和范围实例详解

    闭包的典型应用场景包括: - 保存外部状态:在函数内部创建一个函数,该内部函数可以访问并修改外部函数的局部变量,即使外部函数已经执行完毕。 - 隐藏变量:通过闭包,可以在全局作用域中创建私有变量,避免全局...

    深入浅出理解JavaScript闭包的功能与用法

    JavaScript闭包是一种特殊的对象,它能够记住并访问所在词法作用域,即使该作用域已经完成执行。理解闭包对于JavaScript开发者来说非常重要,因为它允许创建封装数据和函数的模块,是实现模块化编程的关键技术之一。...

    详解JavaScript匿名函数和闭包

    关于匿名函数和闭包的示例代码,文档中提到了几个典型的应用场景: 1. 通过闭包访问并修改外部函数的局部变量。 2. 通过闭包在全局环境中使用局部变量,避免全局变量的命名冲突。 3. 循环中使用闭包处理变量取值...

    JavaScript 中级笔记 第四章 闭包

    闭包的一个典型应用是在创建工厂函数(factory function)。在提供的例子中,函数`add`就是一个工厂函数,它返回一个新的函数。当`add(5)`被调用时,返回的函数记住了`num`的值,即5。随后,当`addFive`被调用并传入...

    JS常见面试试题总结【去重、遍历、闭包、继承等】

    闭包的典型应用场景包括模块化封装、数据封装以及函数式编程。实现闭包主要有两种方式,一种是通过原型链,另一种是利用apply和call方法。 4. 继承 继承在面向对象的编程中极为重要,JavaScript中的继承可以通过...

    JavaScript-Core-and-Practice

    事件驱动编程是JavaScript在网络应用中的典型应用场景,通过监听和响应用户或系统的事件来改变页面状态。DOM(文档对象模型)操作是与用户界面交互的基础,JavaScript可以用来查找、修改和添加HTML元素。 异步编程...

    javascript资料大全

    "JavaScript使用技巧精萃.doc"和"JavaScript典型应用与最佳实践-源代码"则是对JavaScript实战经验的总结,可能包含了一些优化技巧、错误处理策略以及设计模式的应用,有助于提升开发效率和代码质量。 综上所述,这...

    JavaScript小技巧全集

    - `for`, `while`, `do...while`循环各有应用场景,熟练掌握它们能有效控制流程。 - `break`和`continue`语句用于提前退出循环或跳过当前循环迭代。 4. 函数与闭包 - 函数是JavaScript中的第一等公民,可以作为...

Global site tag (gtag.js) - Google Analytics