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),这时需注意,不要随便改变父函数内部变量的值。

相关文章
|
21天前
|
自然语言处理 JavaScript 前端开发
JavaScript中闭包:概念、用途与潜在问题
【4月更文挑战第22天】JavaScript中的闭包是函数及其相关词法环境的组合,允许访问外部作用域,常用于数据封装、回调函数和装饰器。然而,不恰当使用可能导致内存泄漏和性能下降。为避免问题,需及时解除引用,减少不必要的闭包,以及优化闭包使用。理解并慎用闭包是关键。
|
1月前
|
JavaScript
闭包(js的问题)
闭包(js的问题)
13 0
|
2月前
|
JavaScript 前端开发
解释JavaScript闭包的工作原理,并举例说明其在游戏开发中的应用。
JavaScript闭包允许内部函数访问并保持对外部函数变量的引用,即使外部函数执行结束。当函数返回内部函数时,形成闭包,继承父函数作用域链。在游戏开发中,闭包用于创建具有独立状态和行为的角色实例。例如,`createCharacter`函数创建角色并返回包含属性和方法的对象,内部函数如`getHealth`、`setHealth`和`attack`通过闭包访问并操作角色的变量。这种方式确保了每个角色的状态在不同实例间独立,是实现游戏逻辑的强大工具。
14 2
|
2月前
|
存储 缓存 JavaScript
|
2月前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:理解其原理与实际应用
探索JavaScript中的闭包:理解其原理与实际应用
20 0
|
2月前
|
自然语言处理 JavaScript 前端开发
深入理解JS的执行上下文、词法作用域和闭包(中)
深入理解JS的执行上下文、词法作用域和闭包(中)
|
2月前
|
存储 自然语言处理 JavaScript
深入理解JS的执行上下文、词法作用域和闭包(上)
深入理解JS的执行上下文、词法作用域和闭包(上)
|
6天前
|
前端开发 JavaScript
闭包在JavaScript中有许多应用场景
闭包在JavaScript中发挥关键作用,如封装私有变量和函数提升安全性,维护变量生命周期,实现高阶函数,模拟块级作用域,支持回调函数以处理异步操作,以及促进模块化编程,增强代码组织和管理。闭包是理解和掌握JavaScript高级特性的重要一环。
21 7
|
12天前
|
自然语言处理 JavaScript 前端开发
【JavaScript技术专栏】深入理解JavaScript作用域与闭包
【4月更文挑战第30天】了解JavaScript的关键在于掌握作用域和闭包。作用域决定变量和函数的可访问范围,分为全局(在`window`或`global`对象中)和局部(函数内部)。闭包则允许函数访问其创建时的作用域,即使在其他地方调用。它通过作用域链保存对外部变量的引用,常用于实现私有变量、模块化和柯里化。然而,不当使用闭包可能导致内存泄漏和性能下降。理解这些概念能提升代码质量,但也需谨慎处理潜在问题。
|
13天前
|
自然语言处理 前端开发 JavaScript
【Web 前端】什么是JS闭包?
【4月更文挑战第22天】【Web 前端】什么是JS闭包?