`

《Javascript高级程序设计(第3版)》闭包理解

阅读更多

“闭包是指有权访问另一个函数作用域中的变量的函数。”--《Javascript高级程序设计(第3版)》

 

      看以下代码:

<script type="text/javascript">
    function outer() {
        var i = 10;
        return function() {
            return i++;
        }
    }
   
    var inner = outer();
    var str = "";
    for (var i=0;i<5;i++) {
        str += inner()+" ";
    }
    document.write(str);
</script>

      结果:10 11 12 13 14

 

      认为闭包是一个现象,是内部函数(function() {return i++})引用了外部函数(outer)的变量(i),且被返回到外部去(var inner = outer()),导致外部函数的执行环境没被释放(i的值得以保存)的现象。

 

      看到那句话的时候,才意识到自己的理解是错误的。上述现象是闭包的特性、现象,这种奇特的现象,可以通过结合作用域链、垃圾收集的知识点得到解释。

 

      现在更新下知识:闭包是一个函数。我们可以通过判断该函数是否能够访问其他函数作用域中的变量、函数来判断一个函数是不是一个闭包。

 

       提出疑问:当一个函数有权限但没有访问其可访问的其他函数的变量、函数时,它还是一个闭包吗?如果根据书中的定义,那么答案是肯定的。

      如下面的代码:

<script type="text/javascript">
    function demo1(name){
        this.getName = function() {
            return name;
        }
    }
   
    var inst  =  new demo1("Lcllao");
    alert(inst.getName());//这个应该是了,通过new方式执行函数test,返回了当时的this对象。通过getName访问当时作用域上的name变量。
    demo1("Lcllao");//在这个时候,上面的匿名函数是闭包吗?
   
    function demo2() {
        var i = 0;
        return function() {//按照上述定义,这个匿名函数应该也是一个闭包。他有权但没访问demo2的变量i。
            return "";
        }
    }
</script>

 

分享到:
评论

相关推荐

    深度探讨javascript函数的原型链和闭包

    深度探讨javascript函数的原型链和闭包

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    深入理解_JavaScript_闭包

    理解 JavaScript 闭包 要成为高级 JavaScript 程序员,就必须理解闭包

    理解_JavaScript_闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

    JavaScript高级程序设计(第3版)学习笔记9 js函数(下)

    再接着看函数——具有魔幻色彩的对象。 9、作为值的函数 在一般的编程语言中,如果要将函数作为值来使用,需要使用类似函数指针或者代理的方式来实现,但是在ECMAScript中,函数是一种对象,拥有一般对象具有的所有...

    Javascript 高级编程第2版PDF part1

    从最佳编程实践到即将成为现实的api,直至javascript未来的发展,全景式地展示了javascript高级程序设计的方方面面。 本书适合不同层次的javascript/web开发人员阅读参考,也可作为高校相关专业课程的教材。

    JavaScript面向对象程序设计

    JavaScript面向对象程序设计(1): 前言 JavaScript面向对象程序设计(2): 数组 JavaScript面向对象程序设计(3): 对象...JavaScript面向对象程序设计(7): 闭包 JavaScript面向对象程序设计(8): 优雅的封装还是执行的效率?

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part1.rar

     2.1.4 理解作用域和闭包是根本   2.2 创建你自己的对象   2.2.1 一变多:创建构造函数   2.2.2 添加静态方法   2.2.3 向原型中添加公有方法   2.2.4 公有、私有、特权和静态成员真那么重要吗   ...

    javascript 闭包

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

    Javascript 高级编程第2版PDF part4

    本书在上一版基础上进行了大幅度更新和修订,融入了近几年来javascript应用发展的最新成果,几乎涵盖了所有需要理解的重要概念和最新的javascript应用成果。从颇具深度的javascript语言基础到作用域(链),从引用类型...

    尚硅谷——JavaScript闭包

    JavaScript闭包 JavaScript闭包 JavaScript闭包 JavaScript闭包

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

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

    javascript闭包高级教程

    javascript闭包高级教程,闭包内部实现机制的完美展现,值得研究,比较难。

    【JavaScript源代码】详解JavaScript闭包问题.docx

     一、变量的作用域 在介绍闭包之前,我们先理解JavaScript的变量作用域。变量的作用域分为两种:全局变量和局部变量。 var n = 999; //全局变量 function f1() { a = 100; //在这里a也是全局变量 alert(n); }...

    Javascript 高级编程第2版PDF part5

    本书在上一版基础上进行了大幅度更新和修订,融入了近几年来javascript应用发展的最新成果,几乎涵盖了所有需要理解的重要概念和最新的javascript应用成果。从颇具深度的javascript语言基础到作用域(链),从引用类型...

    Javascript 高级编程第2版PDF part3

    本书在上一版基础上进行了大幅度更新和修订,融入了近几年来javascript应用发展的最新成果,几乎涵盖了所有需要理解的重要概念和最新的javascript应用成果。从颇具深度的javascript语言基础到作用域(链),从引用类型...

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    深入理解javascript原型和闭包.pdf

    javascript原型和闭包

    JavaScript高级程序设计 读书笔记之八 Function类及闭包

    Function类 定义 Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: var function_name=new Function(agrument1,agrument2,…,argumentN,function_body); 每个argument都是一个参数,...

Global site tag (gtag.js) - Google Analytics