`

再谈闭包,closure---javascript

阅读更多

              再一次来谈谈javascript,发现现在网上大多数文章对于闭包的认识好像都是认为返回一个内部的函数这样一个标志才能认为是closure(闭包)。 也许有但是很是看到这样的文章能对javascript的闭包能有一个比较清晰地解释。下面我就来谈谈自己对javascript的闭包的看法,如有不对的地方欢迎大家批评一起学习。

              首先,谈谈一个常见的需求。

              有四个link,

           <a href="#" class="mylink" id="0">1</a>

          <a href="#" class="mylink" id="1">2</a>

          <a href="#" class="mylink" id="2">3</a>

         要求点击相应的链接弹出你点击的是第几个。

下面我给出几种实现方式

<html>

    <head>

        <title>sfsdf</title>

        <script language="JavaScript" type="text/javascript">

//第一种实现方式是将局部变量obj,和i传递给外部函数,这样就可以保留局部变量---这应该就是闭包的主要作用保留局部

//变量

            /*function newInit(){

             for (var i = 1; i <= 3; i++) {

             var obj = document.getElementById("a" + i);

             alertfunction(obj, i);

             }

             }

             function alertfunction(obj, i){

             obj.onclick = function(){

             alert(i);

             }

             }

             */

/*

    第二种跟下面的是一样的,只是这里是对所有的标签进行取得

            function newInit(){

var links=document.getElementsByTagName("a");

                for (var i = 0; i < links.length; i++) {

var link=links[i];

                   link.onclick=function()

{

var row=i;//row保留局部变量i

return function()

{

alert(row);//弹出

}

}();//立即执行

 

                    }

                }

            */

        function newInit(){            

            for (var i = 0; i < 3; i++) {

                var link = document.getElementById(i);

                link.onclick = (function(){

                    var row = i;//保留变量

                    return function(){

                        alert(row);

                    }

                })();

 

 

            }

        }

        </script>

    </head>

    <body onload="newInit()">

        <a href="#" class="mylink" id="0">1</a>

        <a href="#" class="mylink" id="1">2</a>

        <a href="#" class="mylink" id="2">3</a>

    </body>

</html>

 

 

另外附上一段英文,对javascript闭包的总结

 

  • Whenever you use function inside another function, a closure is used.
  • Whenever you use eval() inside a function, a closure is used. The text you eval can reference local variables of the function, and within eval you can even create new local variables by using eval('var foo = 
  • When you use Function() inside a function, it does not create a closure. (The new function cannot reference the local variables of the function callingFunction()).
  • A closure in JavaScript is like keeping a copy of the all the local variables, just as they were when a function exited.
  • It is probably best to think that a closure is always created just on entry to a function, and the local variables are added to that closure.
  • A new set of local variables is kept every time a function with a closure is called (Given that the function contains a function declaration inside it, and a reference to that inside function is either returned or an external reference is kept for it in some way).
  • Two functions might look like they have the same source text, but have completely different behaviour because of their 'hidden' closure. I don't think JavaScript code can actually find out if a function reference has a closure or not.
  • If you are trying to do any dynamic source code modifications ( for example: myFunction = Function(myFunction.toString().replace(/Hello/,'Hola')); ), it won't work if myFunction is a closure (Of course, you would never even think of doing source code string substitution at runtime, but...).
  • It is possible to get function declarations within function declarations within functions - and you can get closures at more than one level.
  • I think normally a closure is the term for both the function along with the variables that are captured. Note that I do not use that definition in this article!
  • I suspect that closures in JavaScript differ from those normally found in functional languages.

分享到:
评论

相关推荐

    前端开源库-closure-loader

    Closure Loader是一个专为前端开发者设计的开源工具,主要用于处理Google闭包库(Closure Library)的依赖管理。这个加载器是Webpack的一个插件,它允许开发者在Webpack构建流程中无缝地整合Closure Library,从而...

    closure-compiler-npm, 用于管理和记录关闭编译器的包,通过npm使用.zip

    closure-compiler-npm, 用于管理和记录关闭编译器的包,通过npm使用 google-closure-compiler 用闭包编译器检查。编译。优化和压缩 Javascript这个库跟踪发布到 npmjs.org 和相关插件的相关问题。 任何与插件无关的...

    google-closure-library-v20180405-50-gda9add3.zip

    《Google Closure Library 20180405:JavaScript编程的艺术与实践》 Google Closure Library,简称Closure Library,是Google开发的一个强大的JavaScript库,它为开发者提供了丰富的工具和资源,帮助构建高质量、高...

    JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解

    在深入讨论JavaScript闭包之前,首先需要了解JavaScript的变量作用域。在JavaScript中,变量的作用域分为两种:全局变量和局部变量。全局变量是在函数外部定义的变量,可以在JavaScript程序的任何地方被访问。局部...

    closure闭包

    在Java中,你可以使用Lambda表达式或匿名内部类来创建闭包,而在JavaScript中,所有的函数都是闭包。在C#中,可以使用`Action`、`Func`等委托类型或`lambda`表达式来创建闭包。 总的来说,闭包在编程中扮演着至关...

    closure-compiler-npm:用于管理和记录闭包编译器的软件包,可通过npm使用

    谷歌关闭编译器使用Closure-Compiler检查,编译,优化和压缩JavaScript 该存储库跟踪与发布到npmjs.org和相关插件有关的问题。 与插件本身无关的任何错误都应报告给。配套该编译器分布在多个平台上。 每个平台都是其...

    closure-compiler:围绕 Google Closure Compiler 的 PHP Wrapper

    Closure Compiler 是一个让 JavaScript 下载和运行速度更快的工具。 它是一个真正的 JavaScript 编译器。 它不是从源语言编译为机器代码,而是从 JavaScript 编译为更好的 JavaScript。 它解析您的 JavaScript,...

    closure-compiler,javascript检查器和优化器。.zip

    闭包编译器是一个让javascript下载和运行更快的工具。它是一个真正的javascript编译器。它不是从源语言编译成机器代码,而是从javascript编译成更好的javascript。它解析你的javascript,分析它,删除死代码,重写并...

    JavaScript闭包(closure).pdf

    JavaScript中的闭包是一种高级特性,它是函数和其周围状态(词法作用域)的组合,即使函数在其定义的作用域之外被调用,它仍然能访问到这些状态。这个概念是JavaScript编程中的核心部分,尤其在处理异步操作、模块化...

    javascript 闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    Javascript 闭包完整解释

    ### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ...

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: ... Javascript中有几个非常重要的语言特性——对象、原型...闭包是Closure, 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    closure-builder:基于NPM的Closure构建系统可轻松将Soy模板文件与Closure JavaScript文件一起编译,而无需进行任何配置

    编译闭包样式表(.gss)文件编译JavaScript文件编译Node.js文件编译汇总文件(实验性) 编译css文件复制资源复制远程资源将Markdown(.md)转换为.html文件最佳实践发展免责声明作者执照 安装使用NPM并使用npm ...

    理解javascript函数式编程中的闭包(closure)_.docx

    本篇文章主要探讨JavaScript函数式编程中的一个重要概念——闭包(closure)。闭包是一种特殊的函数,它能记住其定义时的作用域,即使在函数执行完毕后,仍然可以访问到该作用域内的变量。在JavaScript中,每个函数...

    闭包javascript.pdf

    在计算机科学中,闭包(Closure)是一种函数,它在一个包含一个或多个绑定变量的环境中被评估。当这个函数被调用时,它可以访问那些绑定变量。换句话说,闭包可以记住在其创建时周围存在的任何变量的状态,即使在...

    closure-calculate-chunks

    node --preserve-symlinks node_modules/closure-calculate-chunks/index.js --entrypoint ./src/js/entry.js 注意:应使用--preserve-symlinks选项启动使用该库的节点进程,否则返回的文件路径可能与节点模块解析...

Global site tag (gtag.js) - Google Analytics