1.什么是闭包



1)官方解释

一个拥有多个变量和绑定了这些变量的环境的表达式(一般是一个函数)。因而这些变量也是该表达式的一部分。

我的理解:所谓的闭包就是连接函数内部和函数外部的一座桥梁。使得在外部也可以訪问到函数内部的变量。

2)闭包的特点

A:作为一个函数变量的一个引用,当函数返回时,其处于激活状态。

B:一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

2.闭包的用途

A:读取函数内部变量

<span style="font-family:SimSun;font-size:18px;">function People(name) {
var name ="张三";
return function () {
alert(name);
}
}
var Job = new People();
Job();</span>

解释:正如上述的代码所看到的,name是定义在People中的函数,是函数People中的局部变量,而我们在外部是无法訪问到的,可是People函数返回了一个内部函数,而这个内部函数是对变量name的一个引用,这就形成了一个闭包,所以在外部也能够訪问到People函数的内部变量(特点一);正如上述代码所看到的,假设name在函数People调用完后不能再訪问的话,则将被释放。而在本例中却被还有一个函数所返回,所以还会包括在栈中(特点二)。

B:保存变量始终在内存中

这也是闭包的不利处之所在地,由于闭包会使得函数中的变量保存在内存中,内存消耗非常大,所以不能滥用闭包。否则会造成网页载入缓慢问题等,解决办法就是在退出函数之前,来销毁不使用的局部变量。

3.思考题



1)样例1

<span style="font-family:SimSun;font-size:18px;">function Test1() {
var a = 0;
function Test2() {
a++;
alert(a);
}
} Test2();//是错误的。作用域在Test1,外部无法訪问到</span>

2)改动后

<span style="font-family:SimSun;font-size:18px;">function Test1() {
var a = 0;
function Test2() {
a++;
alert(a);
}
return Test2; //改动操作例如以下
}
var obj = Test1();
obj();//返回1
obj();//返回2
var obj2 = Test1();
obj2();//返回1
obj2();//返回2</span>

4.小结

以上就是对闭包的所有理解。简单的一句话:闭包就是搭建外部函数与内部函数的桥梁。

上述仅仅是对闭包的一点点了解。有疑问之处,还请多多指正。



版权声明:本文博客原创文章,博客,未经同意,不得转载。

分析javascript关闭的更多相关文章

  1. 小技巧——病毒分析中关闭ASLR

    原文来自:https://bbs.ichunqiu.com/thread-41359-1-1.html 病毒分析中关闭ASLR 分析病毒的时候,尽可能用自己比较熟悉的平台,这样可以大大地节省时间,像我 ...

  2. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  3. 从一道面试题分析javascript闭包

    据说是一不注意就会做错的五道javascript面试题之一,我们来看看这道题长什么样 function Container( properties ) { var objthis = this; fo ...

  4. 如何捕获和分析 JavaScript Error

    前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常 ...

  5. JavaScript关闭窗口的同时打开新页面的方法

    做网页的时候需要弹出一个小窗口,然后要实现一个功能就是鼠标点击超链接关闭小窗口并打开一个新页面,就如同下图: 这是一个小窗口,点击超链接这个窗口会关闭并且会正常在浏览器打开新页面,首先写js关闭窗口的 ...

  6. JavaScript关闭窗口的方法

    当你创建了一个新窗口时,将open()方法的返回值分配给一个变量非常重要.比如,下面的语句就是创建一个新窗口,然后立即关闭它: win = window.open("http://www.d ...

  7. javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法

    在很多人眼里,北京是一个物欲横流的社会,生活节奏之快,让你一丝都不能停下来,走在路上伴随着人群急速往前涌,或许有些人都不知道要去哪.也不知道自己想要的是什么?在一个浮躁的社会里,多了一些浮躁的人,到处 ...

  8. JavaScript关闭浏览器

    (*^__^*) 嘻嘻……,以前我找关闭浏览器选项卡的代码找不到,我还以为要用后台代码关呢?今天发现只要简单2句JavaScipt代码就可以了.看来很多东西还是在于平时的积累啊的说! 模仿延儿的口气了 ...

  9. 简要分析javascript的选项卡和轮播图

    选项卡 思路 1.按钮和展示的页面要对应:分别遍历,记住当前按钮的索引,让其成为展示页面的索引 2.只出现所对应的页面:所有的页面隐藏,只展示想要的页面 只展示js代码 for(var i=0;i&l ...

随机推荐

  1. 开源的Android视频播放器

    之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...

  2. PHP - 防止 XSS(跨站脚本攻击)

    <?PHP /** * @blog http://www.phpddt.com * @param $string * @param $low 安全别级低 */ function clean_xs ...

  3. bootloader启动代码init.s解析----IRQ中断处理函数

    bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...

  4. 自定义的Server

    自定义的Server 我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——Kes ...

  5. Qt学习之路:自定义Model三篇,自定义委托等等

    http://devbean.blog.51cto.com/448512/d-8/p-2

  6. runnable与handler结合使用,其实跟在Thread中的run()中sleep的效果是一样的

    这是一种可以创建多线程消息的函数使用方法:1,首先创建一个Handler对象Handler handler=new Handler();2,然后创建一个Runnable对象Runnable runna ...

  7. Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。

    Android下得到Home键按下的消息   在Android下,并不能通过onKeyDown这样的事件来截获Home键的消息,其原因在Android的文档中已经明确的说过了 public stati ...

  8. jsp截取字符串

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> < ...

  9. 基于visual Studio2013解决C语言竞赛题之0613递归求积

     题目

  10. cocos2d-x游戏开发系列教程-坦克大战游戏之坦克的显示

    1.先定义坦克的一些属性 class Tank : public CCSprite { public : Tank(); ~Tank(); static Tank* createTankWithTan ...