- 浏览: 218512 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
cuit_miaolin:
[b][flash=200,200][url][img][li ...
select、input-checkbox标签的多值处理 -
FZtree:
写controller 在action里面 @你要传递的变量
在rails中执行sql语句 -
mhzyb:
长见识了!
理解prototype.js的bind函数 -
ggjjl1:
mark
windows下PHP安装imagick扩展 -
lihaoyxj:
你好,请问如何在rails中执行SQL语句的select的返回 ...
在rails中执行sql语句
原文地址:http://www.javascriptkit.com/javatutors/closures.shtml
以下文字,与原文不同,有改编。
先看常用的函数:
function sayHello(name) { var text = 'Hello ' + name; var sayAlert = function() { alert(text); } sayAlert(); } sayHello('Bob');
闭包的例子
一句话描述:
- 闭包是函数的局部变量,在函数return之后,仍然有值, 或者
- 闭包是stack-frame,在函数return的时候,它不会被释放。(就好像'stack-frame'是内存分配、而非处于堆栈!)
下面的代码返回一个function的引用:
function sayHello2(name) { var text = 'Hello ' + name; // local variable var sayAlert = function() { alert(text); } return sayAlert; } var say2 = sayHello2('Jane'); say2(); //hello Jane
多数JavaScript程序员能够理解上面代码的函数引用如何返回给变量。请在学习闭包之前理解它。C程序员把函数看做返回的一个函数指针,变量sayAlert和say2分别是函数指针。
C函数指针和JavaScript的函数引用有着本质的不同。在JavaScript,函数引用变量既是一个函数指针,又是一个隐藏的闭包指针。
上面代码拥有闭包,因为函数体内又声明了一个匿名函数 function() { alert(text); } ,参看例子中的sayHello2()。如果你在另一个函数内使用function关键字,闭包就产生了。
在C和其他多数语言,当函数return之后,stack-frame就被销毁了,所有的局部变量也就不能访问了。
在JavaScript中,如果你在函数里声明了函数,在你调用的函数renturn之后,局部变量仍然可以访问。请注意上面的例子,我们调用了变量text,它是函数sayHello2的局部变量。
Example 3
这个例子表明局部变量不是拷贝传递,而是引用传递。在外层函数退出时,它把stack-frame保存在内存。
function say667() { // Local variable that ends up within closure var num = 666; var sayAlert = function() { alert(num); } num++; return sayAlert; } var sayNumba = say667(); sayNumba(); //667,而不是666 alert(sayNumba.toString());
Example 4
三个函数对某个闭包使用同一个引用,因为它们均在setupSomeGlobals()里声明的。
var gAlertNumber = gIncreaseNumber = gSetNumber = null; function setupSomeGlobals() { // Local variable that ends up within closure var num = 666; // Store some references to functions as global variables gAlertNumber = function() { alert(num); } gIncreaseNumber = function() { num++; } gSetNumber = function(x) { num = x; } } setupSomeGlobals(); //任意、多次 运行下面的函数 gAlertNumber(); gIncreaseNumber(); gSetNumber(5); //把num重新设为 5 gSetNumber(-8888); //把num重新设为 -8888
重新运行setupSomeGlobals(); 就会重新产生一个新的闭包。在JavaScript中,当你在函数里又声明一个函数,外部函数每调用一次,内部函数将再被重新产生一次。
Example 5
当心下面例子的循环:闭包中的局部变量可能和你最初想的不一样。
function buildList(list) { var result = []; for (var i = 0; i < list.length; i++) { var item = 'item' + list[i]; result.push( function() {alert(item + ' ' + list[i])} ); } return result; } function testList() { var fnlist = buildList([1,2,3]); // using j only to help prevent confusion - could use i for (var j = 0; j < fnlist.length; j++) { fnlist[j](); } } testList(); //输出3次:'item3 undefined'
Example 6
下面的例子表明,闭包包含了 在外部函数退出之前、定义的任何局部变量。注意,变量alice实际上在匿名函数之后声明的。匿名函数先被声明:当函数被调用时,它可以访问alice,因为alice在闭包里。
function sayAlice() { var sayAlert = function() { alert(alice); } // Local variable that ends up within closure var alice = 'Hello Alice'; return sayAlert; } sayAlice()(); //Hello Alice alert(alice); //错误:alice不是全局变量,它在函数体内var了
Example 7
下面的例子表明,每次调用会产生各自的闭包。
function newClosure(someNum, someRef) { // Local variables that end up within closure var num = someNum; var anArray = [1,2,3]; var ref = someRef; return function(x) { num += x; anArray.push(num); alert('num: ' + num + '\nanArray ' + anArray.toString() + '\nref.someVar ' + ref.someVar); } } closure1 = newClosure(40, {someVar : 'closure 1'}); closure1(5); closure2 = newClosure(1000, {someVar : 'closure 2'}); closure2(-10);
小结
读一些说明要比理解上面的例子难得多。我对于闭包的说明以及stack-frame等等在技术上可能不正确 --- 但是它们的确有助于理解。
观点:
评论
var bankList = $('ul.bankList li');
var len = bankList.length;
for(i=0; i<len; i++) {
$(bankList[i]).click(function(j) {
return function() {$(bankList[j]).find('input').attr("checked",true);};
}(i));
}
要实现的效果,就是点击<li>的时候,字段选中radio:
<ul class="bankList">
<li>
<input type="radio" class="radio" id="bankCMB" name="bank" value="CMB">
<a href="javascript:void(0);"><img src="zs-yh.png" alt="招商银行"></a>
</li>
<li>
<input type="radio" class="radio" id="bankICBC" name="bank" value="ICBC">
<a href="javascript:void(0);"><img src="gs-yh.png" alt="中国工商银行"></a>
</li>
<li>
1. 闭包中的环境变量如果是在循环中,那么使用闭包变量的时候是循环结束后的值
2. 闭包环境变量可以定义在方法后,不影响使用
发表评论
-
取消 Google 搜索结果链接重定向,外加新页面打开
2012-11-30 10:38 1704chinaz有篇文章《取消 Google 搜索结果链接重定向》 ... -
启用右键功能的chrome插件
2011-08-14 08:26 2338经常碰到一些屏蔽右键功能的网页,无法查看网页源代码、点出右键菜 ... -
javascript优秀博客
2011-01-18 08:55 1202《使用面向对象的技术创建高级 Web 应用程序》 《理解Ja ... -
nodejs解决了在服务器端运行js的问题
2010-12-07 18:13 3244吴浩介绍我看看《nodejs》,在我的VPS上配好后,发现它解 ... -
CALLBACK 与 FUNCTIONS
2010-06-30 11:24 1338CALLBACK AND FUNCTIONS ------- ... -
简单的事件处理代码 from g.cn
2010-06-29 19:49 1016g.cn首页不再跳转了,放了一张图片,鼠标点击客户区,页面 ... -
Firefox扩展--PageShare
2009-12-26 11:34 989平时浏览网页,碰到比较好的文章,就想分享给朋友。 有的 ... -
ECMAScript 5正式发布
2009-12-15 08:58 1199这周ECMAScript 5也即众所周知的JavaScri ... -
刷UCHome的火狐扩展--Homezilla
2009-12-11 15:50 1074用uchome做的sns社区,用户每天可以获取一些积分,比如登 ... -
eval会把参数中的大括号视作复合语句的标识
2009-11-17 23:08 1784var jsonStr = $('#jsonData').va ... -
用js模拟PHP的print_r功能
2009-11-10 11:51 3874最近参与一个PHP与flash交互的项目,数据格式采用json ... -
《JavaScript语言精粹》拾零
2009-10-01 08:03 977我在看《JavaScript语言精粹》的时候,有些零碎的知识点 ... -
俄罗斯方块游戏
2009-07-27 13:55 1049受吴浩 提醒,我写了个俄罗斯方块的小游戏。之前,我的思路有问 ... -
提高JavaScript性能的三个小知识
2009-07-13 08:19 957--------------- 木鱼说 --------- ... -
js的作用域
2009-07-12 18:03 1150PHP的函数里,不能直接访问函数外面的变量,除非显式地声明该变 ... -
js函数的几种写法
2009-07-12 16:34 2080最常见的: function foo() { alert ... -
理解prototype.js的bind函数
2009-07-11 17:34 7524先看call(或apply)的用处: var first_o ... -
edwards推荐的十大js资料站
2009-07-11 14:28 899edwards的about栏目回答了很多网友的提问。有人问: ... -
关于object.extend在prototype和google doctype里的对比
2009-07-09 11:28 1433prototype.js里的代码: Object.exten ... -
nodeType的定义
2009-06-27 14:53 1034在《网页制作完全手册》里,nodeType的值只提到了两个, ...
相关推荐
javascript closures leaning,闭包学习
secrets_of_javascript_closures.pdf
scope-chains-closures, Javascript作用域链和闭包 workshop 范围链和闭包 workshop正在启动$ npm install -g scope-chains-closures$ scope-chains-closures # or, shorter: sccjs使用箭头
维基百科这样定义了JS闭包:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使...
本文实例讲述了javascript中的闭包概念与用法。分享给大家供大家参考,具体如下: 闭包的概念:闭包是指有权访问另一个函数作用域中的变量的函数 (引自《javascript高级程序设计第三版》178页)。闭包的优点是不会...
介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure)。闭包其实大家都已经谈烂了。尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的。 正如...
在这个项目中,我们将提供实践JavaScript问题,以帮助您更好地了解closures和constructors 。 设置 Fork此存储库。 Clone你的叉子。 用浏览器打开./index.html 。 方向 完成closures.js和constructors.js内部的...
NULL 博文链接:https://butterflymacro.iteye.com/blog/1271789
深入理解JavaScript系列(16):闭包(Closures) 深入理解JavaScript系列(17):面向对象编程之一般理论 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略...
深入理解JavaScript系列(16):闭包(Closures) 深入理解JavaScript系列(17):面向对象编程之一般理论 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略...
学习关闭创建计算器我将创建一个计算器,以详细了解javascript中的闭包
The first module Mastering JavaScript, stress on practical aspects of Javascript development like—Functions and Closures, Runtime debugging techniques, project layout, events and DOM processing, ...
Java Closures and Lambda.pdf
上有幻灯片将代码转换为无闭包等效项要将某些常规JavaScript转换为演示的无封闭版本,请访问并添加一些代码。 请注意,它非常有限,不会处理任何边缘情况(例如,每行多个var声明,函数声明等)
- Get familiar with the Functions and Closures of JavaScript - Explore Regular Expressions in JavaScript - Code using the powerful object-oriented feature in JavaScript - Test and debug your code ...
, AMD, Asynchronous Operations, Callbacks, Promises and Deferreds, Code Quality, Function Polymorphism, Function Scope, Hoisting and Closures, Functional Programming and Stateless Functions, ...
在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣。 于是乎在网上下了个WAMP集成开发环境,是PHP5.3版本的(PHP5.3开始引入了闭包的特性),不得不说WAMP安装使用真的很方便。简单配置了一下,开始...