4、JavaScript高级之闭包

一、什么是闭包

距离上一次更新有一段时间了,过年你懂得,接下来就谈谈JavaScript的高级用法——闭包。js的闭包其实不是什么难懂的高深的概念,只是有些书籍当中介绍的不够易懂或者说举得例子不太恰当,现在我们就通过简单的例子来理解“闭包”。作为程序员,也许一段针对的代码,比那些文字描述更能说明问题,用代码说话,眼见为实。

好了,先看下面的一段代码:

   function t1(){
        var age = 20;
         function t2(){
            alert(age);
        }
        return t2;
    }
    var age = 100;
    var temp = t1();
    temp();//20

为了突出 执行效果,在t1函数外层也定义了一个age=100的变量,执行完 var temp = t1(); 后,将函数t2赋予了temp,这样temp其实就是t2函数的引用,紧接着执行temp,输出结果竟然是20,毫无疑问,变量age是在t1函数的作用域下的,你已经看到JavaScript语言与其他语言不同的地方。

在大部分语言中,如java,函数t1内的局部变量会随着函数t1执行结束而销毁,但是在js中,变量age=20却被t2捕抓,即使是t1函数执行结束后,依然可以通过t2访问到age

这种情况,即返回的t2函数不是孤立的,甚至把周围的变量环境,形成了一个‘封闭包’,一起返回,所以叫‘闭包’

二、闭包的应用

JavaScript既然有闭包的实现,那么JavaScript的闭包是怎么使用的或应用在哪种情况下呢?通过上面的例子已经看到,函数t1内部的age变量只能通过返回的t2函数访问,那么age是不是相当于java的private私有变量呢,哈哈,这个在下一篇会讲到,而且将通过“闭包”将属性封装在内部,做成接口,别人也就看不见,也不会污染到其他的变量,想想是不是呢。

讲那么多,我们就通过一个实际的例子看看:

要求:实现一个计数器,每次调用某函数,使计时器的值加1

1、闭包实现

   function counter(){
        var i = 0;//但counter执行完毕后,除了返回的inc函数,其他函数访问不了变量i
        var inc = function(){
            return ++i;
        }
        return inc;
    }
    var c = counter();
    alert(c());
    alert(c());
    alert(c());

2、可以结合“匿名”函数,进行简化

   var counter = (function(){
        var i = 0;
        return function(){
            return ++i;
        }
    })();
    alert(counter());
    alert(counter());
    alert(counter());

相信你已经看到了闭包的好处,但是请不到胡乱使用闭包,因为在IE浏览器下是使用“计数”的方式跟踪对象来进行垃圾回收的,由于闭包的特新,不会释放局部变量,如果造成过多的循环引用,将会引起“内存泄露”。

时间: 2024-11-08 08:03:36

4、JavaScript高级之闭包的相关文章

5、JavaScript高级之私有属性

学过java或者C++都知道,给对象声明一个私有属性使用private关键字就可以实现,但是在JavaScript中可不可以声明一个私有属性,答案肯定是可以的,你就相当于写了一句废话吧o(╯□╰)o. 在实现JavaScript的私有属性之前,先来看看一道百度的面试题: 实现一个对象,对象中有个私有属性,对象外部无法访问,但是可以通过接口实现设置和访问. 如果看过上一篇的<JavaScript高级之闭包>文章,那么很快就可以解决上面的面试题.没错,JavaScript的私有属性封装就是通过闭包

读javascript高级编程03-函数表达式、闭包、私有变量

一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); function test(){ alert(1); } 2.函数表达式不会进行函数提升,函数调用在函数声明之前的话会报错: test(); // test is not a function var test=function(){ alert(1); } 二.递归函数 递归函数是通过在函数内部调用自身实现的

JavaScript 高级篇之闭包、模拟类,继承(五)

本篇主要分享我对闭包的理解及使用闭包完成私有属性.模拟类.继承等,结合大量例子,希望大家能快速掌握!首先让我们先从一些基本的术语开始吧 一.javascript中的闭包 1.我们一起先来理解什么是函数的作用域. 2.调用的对象 结合例子: 复制代码 代码如下: function display(something) { function executeDisplay1() { document.write("我在帮老板打印:"+something+"<br />&

一篇文章把你带入到JavaScript中的闭包与高级函数

在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. function dada() { var a = 1; var b = function() { console.log(a); } return b // b 就是一个闭包函数,因为它能访问dada函数的作用域 } JavaScript的函数也是对象,可以有属性,可以赋值给一个变量,可以放在数组里作为元素

javascript高级特性

01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_对象_定义函数对象09_对象_内建对象10_原型_为函数对象增加属性或方法11_原型_利用函数对象本身重写原型12_继承_函数对象之间的继承13_继承_普通对象之间的继承 javascript高级特性(面向对象): * 面向对象:   * 面向对象和面向过程的区别:     * 面向对象:人就是对象,年龄\

JavaScript中的闭包(Closure)

在上一篇介绍JavaScript this 关键字的文章中我们提到了闭包这个概念.闭包是指有权访问另一个函数作用域中的变量的函数.从函数对象中能够对外部变量进行访问(引用.更新),是构成闭包的条件之一.创建闭包的常见方式,就是在一个函数内部创建另一个函数.为了理解闭包,先来看一下什么是变量的生命周期. 变量的声明周期,就是变量的寿命,相对于表示程序中变量可见范围的作用域来说,生命周期这个概念指的是一个变量可以在多长的周期范围内存在并能够被访问.看下面一个例子: functionextent() 

JavaScript 小记 之 闭包(Closures)

Closures are functions that refer to independent (free) variables. 闭包是以静态方式/词法方式进行存储所有父作用域的一个函数 在JavaScript高级程序设计里面通过一个 createComparisonFunction() 函数和这个函数的作用域链之间的关系图说得很明白为什么闭包可以访问外部函数的变量, 是因为闭包的作用域链不仅包括自己本地的活动对象, 还包括外部函数作用域链所指向的活动对象. 在JavaScript高级程序设

【深入理解javascript原型和闭包系列 】 历时半月完稿,求推荐

从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评论的人.特别是在后期讲闭包的时候. 我从来都不做基础入门教程,因为基础入门的教程,要想讲的和别人不一样很难.所以,基础入门的教程网上有的是,大家随便搜索就是了,再大不了就花钱买本书看看.而想原型和闭包这类的稍微高级一些的教程,仔细想想,还真的有的讲,真的能讲出自己的思路. 我觉得只要是自己埋头要做的

JavaScript高级程序设计15.pdf

组合继承的问题是会调用2次超类型构造函数 寄生组合式继承 即通过借用构造函数来继承属性,通过原型链的形式来继承方法,思路:不必为了指定子类型的原型而调用超类型的原型,我们所需要的无非是超类型原型的一个副本而已 function inheritPrototype(subType,superType){ var prototype=object(subType.prototype); //创建对象 prototype.constructor=subType; //增强对象 subType.proto