转载 - 读博客 - 笔记 - JS中的闭包(closure)

原博客标题:JS中的闭包(closure)原博客地址:http://www.cnblogs.com/jingwhale/p/4574792.html

笔记如下:

1. 函数内部声明变量的时候,一定要使用var命令。如果不用的话,实际上是声明了一个全局变量。  

function outer(){
     localVal = 30;
     return localVal;
}
outer();
alert(localVal);//30

2. Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

比如在函数a内定义了函数b,那么a中所有局部变量都可以被b所访问到,然而b中所有局部变量a是不能访问的。

3. 简单的说,闭包(closure)就是能够读取其他函数内部(局部)变量的函数

由于在JavaScript中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

4. JavaScript中的函数定义

定义函数常用的两种方式: 函数声明,函数表达式

函数声明:
function functionName(){
}
函数表达式:
var functionName = function(){
}
可以使用函数表达式创建一个函数并马上执行它:
(function() {
 var a, b // local variables
  // ...      // and the code
})()

JavaScript解析器处理两种方式的区别:

对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析;

对于函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析;

所以在实际中,处理两种函数定义方式的差异表现在,当使用函数声明的形式来定义函数时,可将调用语句写在函数声明之前;而使用函数表达式方式定义的函数时,这样做会报错。

5. 使用闭包的几种开发场景

使用自执行的匿名函数来模拟块级作用域, 从而限制向全局作用域中添加过多的变量和函数影响全局作用域:
(function(){
        // 这里为块级作用域
 })();

循环闭包:
function showAllNum( aLi ){
    for( var i =0,len = aLi.length ;i<len;i++ ){
            aLi[i].onclick = function(){
            alert( i );//all are aLi.length!
        }
    }
}
点击后会一直弹出同一个值 aLi.length 而不是123。当点击之前,循环已经结束,i值为aLi.length。
改写如下
function showAllNum( aLi ){
    for( var i =0,len = aLi.length ;i<len;i++ ){
            aLi[i].onclick = (function(i){
                return function(){
                    alert( i );
                }
            })(i);
    }
}

封装:
var info = (function(){
    var _userId = 23492;
    var _typeId = ‘item‘;

    function getUserId(){
        alert(_userId);
    }

    function getTypeId(){
        alert(_typeId);
    }
})();

info.getUserId();//23492
info.getTypeId();//item

info._userId//undefined
info._typeId//undefined

6. JavaScript中的this

关于js中的this,记住谁调用,this就指向谁;要访问闭包的this,要定义个变量缓存下来。一般喜欢var _this = this。

7. IE9之前,JScript对象和COM对象使用不同的垃圾收集例程,那么闭包会引起一些问题。-- 内存泄漏

8. 闭包的原理 详见原博客

时间: 2024-12-06 02:42:32

转载 - 读博客 - 笔记 - JS中的闭包(closure)的相关文章

转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客<python中decorator详解> 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器--decorator. python中的函数即objects 一步一步来,先了解下python中的函数. def shout(word='hello,world'):     return word.capitalize() + '!'print shout()#输出:Hello,world!#跟其他对象一样,你同样

教育博客在实践中实际上已经发展成为记录教师专业成长

教育博客在实践中实际上已经发展成为记录教师专业成长.发布课题研究成果和反映学校发展历程的工作日 志.网络文集和多媒体成长档案袋.教师可以通过教育博客来记录自己的教育教学实况,跟踪自己的专业发展轨迹,分析进步,查找不足,积累和分享自己的成功经 验和教育智慧:同时,教师也可通过教育博客来收藏.整理自己所需的学习资源,了解教学研究的动态.建立教育博客,可使教师通过开放自己的教学材料.实践体 验和研究心得,在与专家学者.教研员以及更多一线教师乃至学生的互动交流中,逐步成为教学知识的生产者和课程资源的承载

博客园随笔中添加目录导航悬浮框

1,在博客园设置中申请js权限,写明申请理由大约2-3小时通过 2,通过后在后台设置中添加CSS代码 /*生成博客目录的CSS*/ #uprightsideBar{ font-size:12px; font-family:Arial, Helvetica, sans-serif; text-align:left; position:fixed;/*将div的位置固定到距离top:50px,right:0px的位置,这样div就会处在最右边的位置,距离顶部50px*/ top:50px; righ

一篇博客分清shell中的状态返回值-return-break-continue-exit

一篇博客分清shell中的状态返回值-return-break-continue-exit 一.break.continue.exit.return的区别和对比 条件与循环控制及程序返回值命令知识表 命令 说明 break n 如果省略n,则表示跳出整个循环,n表示跳出循环的层数 continue n 如果省略n,则表示跳出本次循环,忽略本次循环剩余代码,进入循环的下一次循环.n表示退到第n层继续循环 exit n 表示退出当前shell程序,n为上一次程序执行的状态返回值,n也可以省略,在下一

C#控制台基础 正则表达式,regex,webclient下载博客园网页中的一张图片

1 网页图 这网页就一张图片,新手入门,找个简单一些的. 2 代码 1 正则表达式,regex,webclient下载博客园网页中的一张图片 2 3 4 using System; 5 using System.Collections.Generic; 6 using System.IO; 7 using System.Linq; 8 using System.Net; 9 using System.Text; 10 using System.Text.RegularExpressions; 1

【转载】博客园背景音乐调用,让音乐为你的博文加点料

[转载]博客园背景音乐调用,让音乐为你的博文加点料 单调的文字怎么行,让音乐为你的博文加点料.什么?你写的是技术型博客不搞这么多文艺,大叔,技术型博客也可以很文艺的诶. 今天下三分,网易云.虾米.所有的XX音乐各占据了国内的音乐市场,不过要论曲库哪家全,网易云虾米撕破脸.所以呢,要想博客加上稳定的音乐外链,就在这两者之间选择吧. 在网站上选择合适的背景音乐并外链 何为“合适的背景音乐”呢?首先是前奏不要太唐突,不然网友一打开你的博客就是“咚咚咚”的声音,撸管到一半犯心脏病怎么办?其次就是曲调柔和

个人博客搭建过程中异常处理

个人博客搭建过程中异常处理 错误分析 如果你使用Hexo遇到同样的问题,这里有一些常见问题的解决方案. YAML Parsing Error JS-YAML: incomplete explicit mapping pair; a key node is missed at line 18, column 29: last_updated: Last updated: %s 参数中包含冒号,请用加引号,如Last updated: %s JS-YAML: bad indentation of a

详解js中的闭包

前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式,深入讲解一下对于闭包的理解,如果有不对请指正. 写在闭包之前 闭包的内部细节,依赖于函数被调用过程所发生的一系列事件为基础,所以有必要先弄清楚以下几个概念: 1. 执行环境和活动对象 ** - 执行环境(execution context)定义了变量或者函数有权访问的其他数据,每个执行环境都有一个与之关联的

js中的闭包之我理解

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能