《JS语言精粹》学习笔记 函数部分の闭包
- 要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量。
闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数内部的子函数才能读取局部变量,所以本质上,闭包就是将函数内部和函数外部链接起来的一栋桥梁。
闭包作用:一个是可以读取函数内部的局部变量,一个是让这些变量的值始终保存在内存中。
注意事项: 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语言精粹》学习笔记 函数部分の闭包的更多相关文章
- swift swift学习笔记--函数和闭包
使用 func来声明一个函数.通过在名字之后在圆括号内添加一系列参数来调用这个方法.使用 ->来分隔形式参数名字类型和函数返回的类型 func greet(person: String, day ...
- Swift学习笔记 - 函数与闭包
import Foundation //1.函数的定义与调用//以 func 作为前缀,返回箭头 -> 表示函数的返回类型func sayHello(name: String) -> St ...
- Scala学习笔记——函数和闭包
1.本地函数 可以在一个方法内再次定义一个方法,这个方法就是外部方法的内部私有方法,省略了private关键字 2.头等函数 var increase = (x: Int) => x + 1 S ...
- js语言精粹读书笔记一
一.语法 1.
- JavaScript语言精粹学习笔记
0.JavaScript的简单数据类型包括数字.字符创.布尔值(true/false).null和undefined值,其它值都是对象. 1.JavaScript只有一个数字类型,它在内部被表示为64 ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- # C语言假期学习笔记——6
C语言假期学习笔记--6 数组 主要学习了一位数组和二维数组. 数组是一组具有相同类型的变量的集合.C语言程序通过元素的下标来访问数组中的元素.(下标从0开始) 一位数组 类型 数组名[元素个数] 二 ...
随机推荐
- GDB调试汇编堆栈
GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...
- [翻译svg教程]Path元素 svg中最神奇的元素!
先看一个实例 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
- 初步了解CPU
了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. ...
- Avoiding InvokeRequired
Just read a good article to do cross-thread calling in an easy and elegant way. It is amazing for it ...
- C#调用exe文件,IIS发布后无法掉用本地exe程序的解决方法
http://blog.csdn.net/junjieking/article/details/6277836?reload这位楼主的问题,我也遇到了,但是我按照他那样操作并没有解决问题,弄了好久终于 ...
- Github+Jekyll —— 创建个人免费博客(一)从零开始
摘要: 本文中我将介绍一下如何在github上搭建个人Blog(博客),也顺便让我们掌握一下github Pages功能,另外还涉及到Jekyll技术. ======================= ...
- 站内全文检索服务来了,Xungle提供免费全文检索服务
免费站内全文检索服务来了,是的,你没听错.全文检索相信大家已经不太陌生,主流检索服务有sphinx.xunsearch等,但这些都受服务器限制,对于中小站长尤其是没有服务器实现就困难了,随着数据量的增 ...
- Jquery学习插件之手风琴
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 关于PHP中<?php ?>的结束标签是否添加
在纯PHP代码中“?>”结束标签最好不要添加 原因:容易导致输出多余的空白或者换行,以及由此产生的一些报错. 比如a.php文件中,在?>标签后面多出空格或者换行,而当b.php文件引入a ...