javascript 闭包最简单理解
首先说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(){})()//无引用的调用方式3void 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(); //弹出1func1(); //弹出1var func2 = function(){ var a = 1; var func3 = function(){ alert(a++); } return func3;}var f = func2(); //func2() 必须先调用一次,才能形成闭包f(); //弹出1f(); //弹出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();//弹出1f();//弹出2其内部的a并没有清空。 |
上面就是匿名函数版,创建的时候就调用一次。
五、闭包的作用
1、减少全局变量
通过上面的了解我们知道,闭包能够将局部变量封装永久局部变量,函数调用完毕后依然存在。它能够令一个局部变量永久存在,如数组,自定义的哈希表对象等。封装到局部变量能够减少全局变量,减少被覆盖的可能性。
2、延长局部变量寿命
这点没办法解释了。
参考:javascript闭包
javascript 闭包最简单理解的更多相关文章
- JavaScript闭包的一些理解
原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...
- 我也谈javascript闭包的原理理解
参考原文:http://www.oschina.net/question/28_41112 前言:还是一篇入门文章.Javascript中有几个非常重要的语言特性——对象.原型继承.闭包.其中闭包 对 ...
- JS闭包的简单理解。优缺点以及垃圾回收机制
闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...
- JavaScript 闭包(个人理解)
当function里嵌套function时,内部的function可以访问外部function里的变量.但这不是闭包 function foo(x) { var tmp = 3; function b ...
- 对JavaScript闭包和原型理解
最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结. 1.闭包 简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这 ...
- JavaScript闭包的深入理解
闭包算是javascript中一个比较难理解的概念,想要深入理解闭包的原理,首先需要搞清楚其他几个概念: 一.栈内存和堆内存 学过C/C++的同学可能知道,计算机系统将内存分为栈和堆两部分(大学的基础 ...
- JavaScript Decorators 的简单理解
Decorators,装饰器的意思, 所谓装饰就是对一个物件进行美化,让它变得更漂亮.最直观的例子就是房屋装修.你买了一套房子,但是毛坯房,你肯定不想住,那就对它装饰一下,床,桌子,电视,冰箱等一通买 ...
- javascript --- 递归的简单理解
递归函数大家都应该比较熟吧?那么,如何在JavaScript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单 ...
- JavaScript闭包函数的理解
闭包就是一个函数能够访问其函数外部作用域中的变量,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁 闭包三大特点: 1. 函数嵌套函数 2. 内部函数可以访问外部函数的变量 3 ...
随机推荐
- iOS 一个app跳转另一个app并实现通信(如A跳到B并打开B中指定页面)
功能实现:A跳到B并打开B中指定页面 步骤: 1.首先创建两个项目(项目A,项目B),在项目B中的info.plist文件中添加URL Types,如下图所示:其中URL idenifier是项目B的 ...
- 解决Spine骨骼混合动画错乱问题
Spine是一个很好的制作2D骨骼动画的软件,其中提供的混合(mix)动画功能可以很柔和过度两个不同的动画,但在混合时期,稍有不善,非常容易出现各种错乱.在Spine2D骨骼动画群上,有人提出全K帧. ...
- Network Alignment(网络比对)模型
两类模型: 第一类:two-steps method 先计算两个网络之间每两个结点的相似性,再从N1*N2对相似性中抽取N1对匹配(N1<=N2). 代表算法:IsoRank 第二类:obj ...
- PowerBuilder 简介及应用 - 数据库系统原理
PowerBuilder 是一种企业级数据库前端应用和多层体系结构开发工具,友好的用户界面,功能强大的数据窗口,是一个集成开发环境. PB 的特点 采用面向对象的编程方法和事件驱动的工作原理. 支持跨 ...
- GridView_RowCommand事件中取得GridViewRow
GridViewRow row = ((Control)e.CommandSource).BindingContainer as GridViewRow;
- 理解jquery的$.extend()、$.fn和$.fn.extend()
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype ...
- 轻量级Lua IDE ZeroBrane Studio 的使用技巧和汉化
快捷键 : alt + shift +鼠标 ,可以块选中文本. F12 折叠/展开 所有 F5 调试运行 点击第二次 将跳转到第一个断点处 F10 单步执行 shift +F10 单步执行,不进入函数 ...
- Excel 读取字符串引发的问题
将EXCEL数据导出的时候如果同一列数据中既有文字,又有数字!读取时一列中要么文字丢失只剩下数字,要么数字丢失,只剩下文字,这是由第一行的数据类型决定的.出现这种问题是由于数据类型不统一造成的. 连接 ...
- fMRI数据分析处理原理及方法(转载)
原文地址:http://www.cnblogs.com/minks/p/4889497.html 近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level-depende ...
- S5Time BCD码存储
,时基为1秒. 当使用S5TIME时,定义数值的范围为0~999,而且要指明使用的时基.时基指定了时间单位. S5TIME时基及相应的时间范围如下: 时基 BCD码 时间范围 10 ms 00 10 ...