JavaScript闭包(二)——作用

简介:  当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数。

一、延迟调用

  当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数。

  但是,传递函数引用的同时无法为计划执行的函数提供参数。可以在代码中调用另外一个函数,由它返回一个对内部函数的引用,再把这个对内部函数对象的引用传递给 setTimeout 函数。执行这个内部函数时要使用的参数在调用返回它的外部函数时传递。


     var outer = 'in outter';
          setTimeout(function () {
            echo(pclosure1, outer);
        }, 10);


二、对Funarg上定义的多种计算方式进行定制


  “A functional argument (“Funarg”) — is an argument which value is a function.”

  函数式参数(“Funarg”) —— 是指值为函数的参数。

例如Underscore类库中的filter方法:


     _.filter([1, 2, 3, 4, 5, 6], function(num) { 
            return num % 2 == 0; 
        });
        _.map([1, 2, 3], function(num){ 
            return num * 3; 
        });


三、读取函数内部的变量


function closure() {
            var innerVar = 0;
            function inner() {
                return  ++innerVar;
            }
            return inner;
        }


通过innerclosure函数中的局部变量innerVar读取了出来。

再例如下面的Singleton 单件:


var singleton = function () {
            var _var = 10;
            function _function() {
                //调用私有变量_var
                return _var;
            }
            return {
                first: function (a, b) {
                    //调用私有变量_var
                    return a+_var+b;
                },
                second: function (c) {
                    //调用私有函数_function
                    return _function() + c;
                }
            };
        }();
        echo(pclosure1, singleton.first(1, 2));//打印为13
        echo(pclosure1, singleton.second(1));//打印为11

通过闭包完成了私有的成员和方法的封装。匿名主函数返回一个对象。对象包含了两个方法,方法1可以方法私有变量,方法2访问内部私有函数。匿名主函数结束的地方的"()",这是指直接执行的意思,这样才能得到return的对象。

 

四、让函数所占用的资源不被GC回收


function closure() {
            var innerVar = 0;
            function inner() {
                return  ++innerVar;
            }
            return inner;
        }
        var quote = closure();
        echo(pclosure1, quote());//1
        echo(pclosure1, quote());//2


第一次引用打印的值为1,第二次引用打印的值2。

可以在上一篇《JavaScript闭包(一)——实现》中查看到没被回收的过程。

 

五、使用闭包的注意点


1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。

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

相关文章
|
29天前
|
前端开发 JavaScript 开发者
Web前端开发中的JavaScript闭包应用
JavaScript闭包是Web前端开发中常见的概念,它可以帮助开发者解决作用域问题,提高代码的可读性和可维护性。本文将介绍JavaScript闭包的基本概念和应用,以及如何在Web前端开发中使用闭包。
19 3
|
1月前
|
JavaScript 前端开发 安全
闭包治愈“全局变量恐惧症”,利用闭包实现JavaScript私有变量(三)
闭包治愈“全局变量恐惧症”,利用闭包实现JavaScript私有变量
|
1月前
|
存储 JavaScript 前端开发
闭包治愈“全局变量恐惧症”,利用闭包实现JavaScript私有变量(一)
闭包治愈“全局变量恐惧症”,利用闭包实现JavaScript私有变量
|
1天前
|
JavaScript 前端开发
JavaScript 的 闭包
JavaScript 的 闭包
3 0
|
6天前
|
JavaScript 前端开发 Java
深入理解JavaScript中的闭包机制
闭包是JavaScript中一个重要且常用的概念,能够帮助我们更好地管理变量和函数作用域。本文将深入探讨JavaScript中闭包的原理及应用,帮助读者全面理解闭包在实际开发中的作用。
15 6
|
6天前
|
存储 自然语言处理 JavaScript
深入理解JavaScript中的闭包机制
闭包是JavaScript中一个重要且常见的概念,它能够帮助我们更好地管理变量作用域和实现数据封装。本文将深入探讨JavaScript中闭包的原理、应用场景以及优缺点,帮助读者更全面地理解和运用闭包机制。
|
7天前
|
JavaScript 前端开发 开发者
深入理解JavaScript中的闭包
闭包是JavaScript中一个重要且常用的概念,它能够帮助开发者有效地管理变量作用域并实现更灵活的编程功能。本文将深入探讨JavaScript中闭包的原理、使用方法以及常见应用场景,帮助读者更好地理解和运用闭包。
9 2
|
23天前
|
缓存 自然语言处理 JavaScript
10分钟带你深入理解JavaScript的执行上下文和闭包机制
JavaScript中的闭包源于计算机科学中的一种理论概念,称为“λ演算”(Lambda Calculus)。λ演算是计算机科学的基础之一,1930年由Alonzo Church提出,它是一种用于描述计算过程的数学抽象模型,也是函数式编程语言的基础。
|
23天前
|
缓存 自然语言处理 前端开发
JavaScript 闭包
JavaScript 闭包,是指函数可以访问其定义时所在的词法环境(lexical environment)中的变量,即使这个函数在其定义的词法环境之外执行。闭包是 JavaScript 中一个重要的概念,它使得
13 1
|
29天前
|
缓存 前端开发 JavaScript
深入理解JavaScript中的闭包机制
在JavaScript编程中,闭包是一个重要的概念。本文将深入探讨闭包的原理和用法,帮助读者更好地理解和应用闭包机制。我们将介绍闭包的定义、工作原理以及在前端开发中的实际应用案例。
10 0

相关产品

  • 云迁移中心