首先说3点与闭包有关系的东西。

一、变量的作用域


变量的作用域不难理解。

1.函数内部可以访问函数外部的变量,而函数外部不能访问函数内部的变量。

2.如果在函数内定义变量的时候,不加var,那么是全局变量(当然函数要被调用过一次,未调用过则报错:变量未定义)。加var,就是局部变量。

一个示例说明上面两点。

1
2
3
4
5
6
7
8
9
10
function f()
{
    p1 = "关羽";
    var p2 = "刘备";
}
window.onload = function(){
    f();//当然,函数必须被调用一次,否则报找不到p1错误了
    alert(p1);//关羽
    alert(p2);//报错:p2 is not defined
}

二、变量的生命周期


生命周期也不难理解。

1.全局变量生命周期为直到页面被关闭。

2.在函数内通过var关键字声明的局部变量在函数退出后就会失效。

三、匿名函数


这是一个匿名函数

1
2
3
setTimeout(function(){ 
    alert(str); //这是一个匿名函数
},2000);

匿名函数的几种调用形式:

1
2
3
4
5
//通过引用调用匿名函数
func1 = function(){
    alert("func1");
}
func1();

注意下面3个示例的 () 其实就同func1()这个括号一样,是函数调用符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//无引用的调用方式1
(function(){
 
}())
 
//无引用的调用方式2
(function(){
 
})()
 
//无引用的调用方式3
void function(){
 
}();

前面的小括号定义匿名函数,后面的小括号调用此匿名函数。记住它的样子喔,不然后面看不懂。

四、闭包


闭包其实说的是这样一种现象:

函数A内部的函数B,被函数A外的变量引用着。函数A内的环境不会销毁(即函数A内的变量永久存在)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var func1 = function(){
    var a = 1;    //退出函数,局部变量丢失
    alert(a++);
}
func1();    //弹出1
func1();    //弹出1
 
var func2 = function(){
    var a = 1;
    var func3 = function(){
        alert(a++);
    }
    return func3;
}
 
var f = func2();    //func2() 必须先调用一次,才能形成闭包
f();    //弹出1
f();    //弹出2其内部的a并没有清空。

此处要特别注意的是,要形成闭包,首先必须先调用一次外层函数。

例如上面的 f ,f引用这函数内的函数func3,而func3是可以访问到a的,所以a也可能会被f引用到。只要f不清空,a也不能销毁。

上面的代码是为了方便理解,实际开发中大多使用匿名函数,这样代码量会更少,而且特别适合装逼。

1
2
3
4
5
6
7
8
9
var f = (function(){
  var a = 1;
  return function(){
    alert(a++);
    }
})();
 
f();//弹出1
f();//弹出2其内部的a并没有清空。

上面就是匿名函数版,创建的时候就调用一次。

五、闭包的作用


1、减少全局变量

通过上面的了解我们知道,闭包能够将局部变量封装永久局部变量,函数调用完毕后依然存在。它能够令一个局部变量永久存在,如数组,自定义的哈希表对象等。封装到局部变量能够减少全局变量,减少被覆盖的可能性。

2、延长局部变量寿命

这点没办法解释了。

参考:javascript闭包

javascript 闭包最简单理解的更多相关文章

  1. JavaScript闭包的一些理解

    原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...

  2. 我也谈javascript闭包的原理理解

    参考原文:http://www.oschina.net/question/28_41112 前言:还是一篇入门文章.Javascript中有几个非常重要的语言特性——对象.原型继承.闭包.其中闭包 对 ...

  3. JS闭包的简单理解。优缺点以及垃圾回收机制

    闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...

  4. JavaScript 闭包(个人理解)

    当function里嵌套function时,内部的function可以访问外部function里的变量.但这不是闭包 function foo(x) { var tmp = 3; function b ...

  5. 对JavaScript闭包和原型理解

    最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结. 1.闭包 简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这 ...

  6. JavaScript闭包的深入理解

    闭包算是javascript中一个比较难理解的概念,想要深入理解闭包的原理,首先需要搞清楚其他几个概念: 一.栈内存和堆内存 学过C/C++的同学可能知道,计算机系统将内存分为栈和堆两部分(大学的基础 ...

  7. JavaScript Decorators 的简单理解

    Decorators,装饰器的意思, 所谓装饰就是对一个物件进行美化,让它变得更漂亮.最直观的例子就是房屋装修.你买了一套房子,但是毛坯房,你肯定不想住,那就对它装饰一下,床,桌子,电视,冰箱等一通买 ...

  8. javascript --- 递归的简单理解

    递归函数大家都应该比较熟吧?那么,如何在JavaScript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单 ...

  9. JavaScript闭包函数的理解

    闭包就是一个函数能够访问其函数外部作用域中的变量,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁 闭包三大特点: 1. 函数嵌套函数 2. 内部函数可以访问外部函数的变量 3 ...

随机推荐

  1. 【P1379】天才的约数和

    来自GDOI2007,原题已不可考-- 又自己做出来了好开心,找特殊性是个关键的切入点 原题: 这天周航遇到了靳泽旭. 周航:"我是天才!" 靳泽旭:"你为什么是天才?& ...

  2. 文件权限及特殊权限管理SUID、SGID和Sticky

    文件权限应用模型: 进程的发起者:     进程属主 进程的属组:      进程属组 进程的属主,是否与文件的属主相同,如果相同,进程则以文件属主的权限来访问文件:否则进程的属主所属的组,其中之一是 ...

  3. Apache-Jemeter web性能测试工具使用

    Jmeter是一款java开源的性能测试软件. 要使用该工具进行性能测试,首先需要下载该工具到你的电脑,接着配置java开发环境以及Jmeter环境.搭建完成之后,OK,我们就可以进行测试了. 测试第 ...

  4. js中event.target

    event.srcElement从字面上可以看出来有以下关键字:事件,源     他的意思就是:当前事件的源, 我们可以调用他的各种属性 就像:document.getElementById(&quo ...

  5. Bash命令积累

    复制本目录下除掉所有的.png文件外的所有其他文件到某个目录下: mv -f !(*.png) ./src/ 除掉所有的.png文件外其余的文件,全部删掉 rm -f !(*.png) 本目录下,不显 ...

  6. Python之路,day8-Python基础

    ***面向对象的好处*** 更容易扩展.提高代码使用效率,使你的代码组织性更强,更清晰 更适合复杂项目的开发 封装 把功能的实现细节封装起来,只暴露调用接口 继承 多态 接口继承 定义 类----&g ...

  7. hadoop streaming 多路输出 [转载]

    转载 http://www.cnblogs.com/shapherd/archive/2012/12/21/2827860.html hadoop 支持reduce多路输出的功能,一个reduce可以 ...

  8. 【转】SSL/TLS协议运行机制的概述

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  9. LeetCode---Stack && Heap

    402. Remove K Digits 思路:一次判断字符若比栈顶字符大则入栈,若小则pop,同时k--,直到k为0,注意最终k没有减为0或者中途栈为空或者最终结果前面带0的情况 public St ...

  10. Fatal error 829---数据库 ID 8,页 (1:80740) 已标记为 RestorePending,可能表明磁盘已损坏(日志备份和热备、双机的重要性)

    问题现象: 在业务数据库中查询:SELECT a.NAME FROM SYSOBJECTS a WHERE a.NAME LIKE '%2015' AND a.XTYPE='u' 提示:消息 21,级 ...