-
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试</title> <script type="text/javascript"> /**** * 首先说明:本例子旨在说明闭包的概念 * 如果只是为了获取点击哪一行li,方法很多,比如给其对象加索引等等 * lis[i] = i;下面就可以使用啦 * * 闭包的标准概念(泛一点的概念是函数处处是闭包): * 将一个函数嵌套在另一个函数内部.被嵌套的函数 (内部函数)是只属于嵌套它的函数(外部函数)的私有函数. 这样就形成了一个闭包. 下面的英文是MDN上面摘抄的 B forms a closure including A, i.e. B can access A's arguments and variables. C forms a closure including B. Because B's closure includes A, C's closure includes A, C can access both B and A's arguments and variables. In other words, C chains the scopes of B and A in that order. **/ window.onload = function () { var lis = document.getElementsByTagName("LI"); for (var i = 0, j = lis.length; i < j; i++) { /* 其实一和二的写法没有什么区别,闭包的编码模式一般来说是这样的, 函数A内部定义啦一个函数B,函数B返回引用给其调用者A,并且赋值给其他作用域中的变量C 当C执行的时候,调用的是A返回的B的引用。这个时候即时A不存在啦,B依然可以获取到A定义的局部变量。 下面的2个变体当中无论是给自执行函数传递参数,函数在自执行函数里面定义一个变量获取外部的变量, 都是自执行函数所定义的局部变量,这里自执行函数就相当于A,返回的函数就相当于B, lis[i].onclick就相当于C */ //方法一 // lis[i].onclick = function (arg) { // return function () { // alert(arg); // }; // }(i); //方法二 // lis[i].onclick = (function () { // var row = i; // /* // var B = function(){ // alert(row); // }; // return B; // */ // return function () { // alert(row); // }; // })(); //方法3---这里涉及到的是Function的作用,直接创建的一个闭包。 /* * Function 构造器创建一个新的Function 对象. * 在JavaScript中每个函数(function)实际是一个Function对象. * Function---函数构造器(A)的内部包含一个匿名的函数体(B) lis[i].conclick(C) * */ // lis[i].onclick = Function('alert(' + i + ')'); //方法4---跟方法3差不多,方法3的构造器里面最后一个就是函数体返回给啦onclick // 二方法四,只不过是执行构造函数里面的函数体,然后返回一个函数给onclick。 // 只要记住闭包的标准公司保管你不会错 lis[i].onclick = (Function("\nreturn(function() {\n\talert("+i+");\n});"))(); } //from mdn--来自火狐开发者中心 // 下例演示了一个嵌套函数:就代指我们所说的标准定义的闭包模式 //addSquares---A square-----B a,b,c---C function addSquares(a, b) { function square(x) { return x * x; } return square(a) + square(b); } a = addSquares(2, 3); // returns 13 b = addSquares(3, 4); // returns 25 c = addSquares(4, 5); // returns 41 /*由于内部函数形成了一个闭包, 你可以把这个内部函数当做返回值返回, 该函数引用到了外部函数和内部函数的两个参数 */ function outside(x) { function inside(y) { return x + y; } return inside; } fn_inside = outside(3); result = fn_inside(5); // returns 8 result1 = outside(3)(5); // returns 8 /*** * 闭包内参数冲突,靠近优先原则(作用域链) * @returns {Function} */ function outside() { var x = 10; function inside(x) { return x; } return inside; } result = outside()(20); // returns 20 instead of 10 //再来一个闭包的例子,数字累加 /**** * 函数A(count)里面包含函数B(add),函数B返回引用给函数A,并且赋值给其他作用域作的局部变量C(myCount) * @returns {Function} */ var count = function(){ var i=0; var add = function(){ return i++; } return add; }; var myCount = count(); myCount();//0 myCount();//1 } </script> <style type="text/css"> li { height: 30px; background: yellow; } </style> </head> <body> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> </body> </html>
相关推荐
主要研究了负传递的性质,利用余蕴涵的概念,给出了有限论域上模糊关系的极小S-负传递闭包的一个求解方法,进一步丰富了模糊关系传递性的对偶性质——负传递性的研究。
离散数学-关系的闭包.ppt
论文研究-基于网络闭包理论的交易型社区网络演化研究.pdf, 随着社会化商务时代的到来,交易型社区的发展越来越成为解决社会化商务中经济性与社会性矛盾的关键.但交易型...
python 03、PYTHon 模块包异常处理 4-1_闭包、装饰器_Day04_AM.mp4
swift菜鸟入门视频教程 07 闭包
研究[n]维空间中[m]个点的最小闭包球(MEB)问题。通过结合确定并删除内部点的技术到序列最小最优化(SMO)方法中,提出一种近似求解MEB问题的改进的SMO-型算法。证明了该算法具有线性收敛性。数值结果表明对于一些...
1.可以读取函数内部的变量 2.可以是变量的值长期保存在内存中,生命周期比较长 3.可以用来实现JS模块
3. 设 R’ 集合A 上的自反关系,且R⊆R’, 则对 1. 输入MR 2. 计数器 k 置初值n-1
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
JavaScript闭包 JavaScript闭包 JavaScript闭包 JavaScript闭包
定义了M- L-闭包系统和M- L-闭包系统间的连续映射、开映射、闭映射,讨论了这些映射的性质.证明了范畴M- L-CS (即M- L-闭包系统及它们之间的连续映射构成的范畴)是topological construct .作为应用,给出了M- L-闭包...
17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级...
第04天-基础-闭包、数组、切片、锁机制 第05天-进阶-排序、链表、二叉树、接口 第06天-进阶-接口与反射详解 第07天-进阶-接口实例、终端文件读写、异常处理 第08天-进阶-goroute详解、定时器与单元测试 第09天-高级-...
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...
深度探讨javascript函数的原型链和闭包
js代码-函数表达式 闭包 私有变量
'5-JavaScript的this与闭包详解.html', '6-JavaScript函数的闭包.html', '7-JavaScript函数闭包中this的变化.html', '8-JavaScript原型揭秘.html', '9-JavaScript数据封装.html', '10-基于原型实现类的继承....
一行代码为UIView及其子类添加点击事件响应。 详情请看:https://github.com/britzlieg/ClosuresKit
适合最低级菜鸟理解的重点难点知识---闭包.zip