要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量。
闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数内部的子函数才能读取局部变量,所以本质上,闭包就是将函数内部和函数外部链接起来的一栋桥梁。
闭包作用:一个是可以读取函数内部的局部变量,一个是让这些变量的值始终保存在内存中。
注意事项: 1)由于闭包会使函数中的变量保存在内存中,内存消耗很大,所以不能滥用。解决办法是在退出函数之前,将不使用的局部变量全部删除。
      2)闭包会在父函数的外部,改变父函数变量的值。所以,如果你把父函数当对象使用,把闭包当做它的公用方法,把内部变量当做它的私有属性。这时不能随便修改父函数内部变量的值。 1 <!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
/*闭包*/ //返回了一个包含两个方法的对象,并且这两个方法继续享有访问value的权限
var myObject=function () {
var value=0;
return{
increment:function(inc){
value+=typeof inc==='number'?inc :1;
},
getValue:function(){
return value;
}
};
}(); //函数无需用new来使用,返回一个包含get_status方法的新对象。此函数可以访问它被创建时的上下文环境。这成为闭包。
var quo=function(status){
return {
get_status:function(){
return status;
}
}
};
var myquo=quo("amazed");
document.writeln(myquo.get_status()); //定义一个函数,它设置一个DOM节点为黄色,然后把它渐变为白色
var fade=function(node){
var level=1;
var step=function(){
var hex=level.toString(16);
node.style.backgroundColor='#FFFF'+hex+hex;
if(level<15){
level+=1;
setTimeout(step,100);
}
};
setTimeout(step,100);
};
fade(document.body);
/*****************实例******************************************/
var add_the_handlers=function(nodes){
var i;
for(i=0;i<nodes.length;i+=1){
nodes[i].onclick=function(e){
alert(i);
};
}
};
var add_the_handlers1=function(nodes){
var i;
for(i=0;i<nodes.length;i+=1){
nodes[i].onclick=function(i){
return function(e){
alert(e);
};
}(i);
}
};
var nodes1=document.getElementsByTagName("button");
add_the_handlers1(nodes1);
</script>
</head>
<body>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
</body>
</html>

什么是闭包:当函数在定义它的作用域的外部被引用时,就创建了该内部函数的闭包,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们。

《JS语言精粹》学习笔记 函数部分の闭包的更多相关文章

  1. swift swift学习笔记--函数和闭包

    使用 func来声明一个函数.通过在名字之后在圆括号内添加一系列参数来调用这个方法.使用 ->来分隔形式参数名字类型和函数返回的类型 func greet(person: String, day ...

  2. Swift学习笔记 - 函数与闭包

    import Foundation //1.函数的定义与调用//以 func 作为前缀,返回箭头 -> 表示函数的返回类型func sayHello(name: String) -> St ...

  3. Scala学习笔记——函数和闭包

    1.本地函数 可以在一个方法内再次定义一个方法,这个方法就是外部方法的内部私有方法,省略了private关键字 2.头等函数 var increase = (x: Int) => x + 1 S ...

  4. js语言精粹读书笔记一

    一.语法 1.

  5. JavaScript语言精粹学习笔记

    0.JavaScript的简单数据类型包括数字.字符创.布尔值(true/false).null和undefined值,其它值都是对象. 1.JavaScript只有一个数字类型,它在内部被表示为64 ...

  6. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  7. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  8. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  9. # C语言假期学习笔记——6

    C语言假期学习笔记--6 数组 主要学习了一位数组和二维数组. 数组是一组具有相同类型的变量的集合.C语言程序通过元素的下标来访问数组中的元素.(下标从0开始) 一位数组 类型 数组名[元素个数] 二 ...

随机推荐

  1. C#调用win32 api程序实例

    1.声明static extern 方法,使用DllImport特性 class MyClass { [DllImport("kernel32", SetLastError = t ...

  2. HDU 2222  AC自动机模板题

    1.HDU 2222 2.题意:给出n个单词,一个字串,求有多少个单词在字串里出现了.注意给出的单词可能会重复,重复的不计. 3.总结:入门题.在查询这里还是不太懂. #include<bits ...

  3. Web服务网站故障分析常用的命令

    1.查看TCP连接状态netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn netstat -n | awk ‘/^tcp/ {++S[$NF]}; ...

  4. 一次sql排序的问题。

    select date, count(fail) as fail,count(win) as win from (select date,(case (result) when 'fail' then ...

  5. gulp使用配置

    gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...

  6. 转载:Hadoop排序工具用法小结

    本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...

  7. 在C#中调用EXE文件

    1. 如果exe文件的返回值是int类型,标识操作执行的结果是否成功,例如: class Program { static int Main(string[] args) { return args. ...

  8. js,css控制网页内容不让选中和复制

    ---恢复内容开始--- JS, CSS控制网页内容不让选择和复制 CSS 控制: <style> body{ -moz-user-select:none;//针对火狐浏览器,谷歌则-we ...

  9. hibernate中SessionFactory与Session的作用

    首先,SessionFactory是线程安全的,SessionFactory用到了工厂模式. 其创建和销毁需要耗费很大的资源,所以一个应用中的一个数据库一般只对应一个sessionfactory. S ...

  10. maven web项目中web.xml

    web.xml 不是web工程必须的. web.xml文件用来配置那些东西:欢迎页,servlet,filter等. web.xml文件中定义了多少种标签元素,web.xml 中就可以出现它的模式文件 ...