- 浏览: 7154509 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
function outerFun() { var a=0; function innerFun() { a++; alert(a); } } innerFun()
上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.
改成如下,也就是闭包:
function outerFun() { var a=0; function innerFun() { a++; alert(a); } return innerFun; //注意这里 } var obj=outerFun(); obj(); //结果为1 obj(); //结果为2 var obj2=outerFun(); obj2(); //结果为1 obj2(); //结果为2
什么是闭包:
当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
--------------------------------------------------------------------------------------------------------
再来看一个例子
function outerFun() { var a =0; alert(a); } var a=4; outerFun(); alert(a);
结果是 0,4 . 因为在函数内部使用了var关键字 维护a的作用域在outFun()内部.
再看下面的代码:
function outerFun() { //没有var a =0; alert(a); } var a=4; outerFun(); alert(a);
结果为 0,0 真是奇怪,为什么呢?
作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4; 并改变其值.
评论
44 楼
shuaijie506
2009-09-18
闭包的这个还是第一次听说,长见识了。
作用域那个早就知道,还是自己试出来的,现在每用一个变量我都要var 定义,要不就会改变其它的值了。(for循环里的i最为明显,不明白的人可以写一个循环,在循环里调用另一个方法,在这个方法也也使用循环,循环变量都用i,你就会见到一个神奇的结果)
作用域那个早就知道,还是自己试出来的,现在每用一个变量我都要var 定义,要不就会改变其它的值了。(for循环里的i最为明显,不明白的人可以写一个循环,在循环里调用另一个方法,在这个方法也也使用循环,循环变量都用i,你就会见到一个神奇的结果)
43 楼
johnicesea
2009-09-17
hanjs 写道
从最后的例子看
outerFun可以引入外部的变量,而函数块内部的变量如果与外部同名而且用var重定义了,说明是函数的内部变量,否则引入的则是outerFun所在作用预的同名变量.
outerFun可以引入外部的变量,而函数块内部的变量如果与外部同名而且用var重定义了,说明是函数的内部变量,否则引入的则是outerFun所在作用预的同名变量.
这样的话我就明白了
42 楼
hlislichking
2009-09-12
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?
稍微修改一下最后一个例子的代码你就明白了:
function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 } var a=4; outerFun(); alert(a);
还用一个例子你可能就更能理解了
function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 } outerFun(); //函数位于var定义变量之前 var a=4; alert(a);
这样的话就会报错,因为执行函数时,才会根据作用域需找定义的变量,此时的变量a还未定义
41 楼
koalaxyq
2009-09-01
Jamson 写道
<script>
function outerFun()
{
var b=0;
function innerFun()
{
a=1;
alert(a);
}
return innerFun; //注意这里
}
var obj=outerFun();
obj(); //结果为1
obj(); //结果为2
alert(outerFun.b); //结果为undefined
alert(obj.b); //结果为undefined
</script>
有人能为我解释一下:最后两个为什么是undefined嘛?
Jamson 写道
obj(); //结果为1
obj(); //结果为2
结果都应为1
Jamson 写道
<
alert(outerFun.b); //结果为undefined
alert(obj.b); //结果为undefined
alert(outerFun.b); //结果为undefined
alert(obj.b); //结果为undefined
因为outerFun是函数,obj是对函数的引用,b是函数内部的局部变量
不能像对象引用属性那样来引用它,也不可能
因而outerFun.b与obj.b都是undefined的
40 楼
Jamson
2009-08-19
<script>
function outerFun()
{
var b=0;
function innerFun()
{
a=1;
alert(a);
}
return innerFun; //注意这里
}
var obj=outerFun();
obj(); //结果为1
obj(); //结果为2
alert(outerFun.b); //结果为undefined
alert(obj.b); //结果为undefined
</script>
有人能为我解释一下:最后两个为什么是undefined嘛?
function outerFun()
{
var b=0;
function innerFun()
{
a=1;
alert(a);
}
return innerFun; //注意这里
}
var obj=outerFun();
obj(); //结果为1
obj(); //结果为2
alert(outerFun.b); //结果为undefined
alert(obj.b); //结果为undefined
</script>
有人能为我解释一下:最后两个为什么是undefined嘛?
39 楼
geke260
2009-04-27
http://www.iteye.com/wiki/Object_Oriented_JavaScript/1317-javascript-object-oriented-technology-6
这里讲的比较详细。。。
这里讲的比较详细。。。
38 楼
peanut_sei
2009-04-23
shinelgz 写道
没有用var 声明的局部变量,都视为全局变量
function test(){
i = 10;//全局变量
}
var i = 0;
test();
alert(i);//out: 10
上面这个函数就是闭包了。
function test(){
i = 10;//全局变量
}
var i = 0;
test();
alert(i);//out: 10
上面这个函数就是闭包了。
同意。
37 楼
jsnjlc
2009-04-22
民工精髓 写道
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?
稍微修改一下最后一个例子的代码你就明白了:
function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 } var a=4; outerFun(); alert(a);
改成这样也许更容易理解,函数的声明在前在后没有关系,只跟调用有关
var a=4; outerFun(); alert(a); function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 }
改完后outerFun还没有声明呢,是undefined,js是一块块的按顺序解释执行。
36 楼
diipo_xiao
2009-04-21
感觉就是还是按照行执行代码,只不过遇到函数的时候就继续,遇到没有var定义的变量,则联系上下文查找var。说明对var的处理优先级很高。
35 楼
我的马甲
2009-04-20
终于可以发贴了..
34 楼
orcl_zhang
2009-04-14
javaeys上有一篇关于js的面向对象的讲解,还有《悟透JavaScript》资料,结合起来看,看完后就会茅塞顿开。
33 楼
sniperking
2009-04-13
学习了,有了一个大概的了解,这个和平常的程序里的闭包概念差不多
32 楼
alex09
2009-04-12
histan 写道
可以给详细相关资料吗?
知识库中的javascript面向对象技术基础有六讲,非常不错,可以去看下的
31 楼
histan
2009-04-10
可以给详细相关资料吗?
30 楼
aninfeel
2009-04-05
定义时和运行时分开,就好懂了。
29 楼
bsq519
2009-04-01
至于最后一个问题。其实就是一个变量作用域的问题。有全局变量,和局部变量。
28 楼
yangtse_ye
2009-03-31
最后一个例子无关闭包这个概念吧
只是跟代码的解析/执行顺序,以及变量的作用域有关
看一下犀角书,理解起来不难的应该
只是跟代码的解析/执行顺序,以及变量的作用域有关
看一下犀角书,理解起来不难的应该
27 楼
chris_zley
2009-03-25
看明白了,就是个变量作用域的关系
最后那个a开始是赋值为4了,后来进入outerFun,赋值为0就改变了全局作用域的a,所以下面也是0
但下面两个例子和前两个例子有什么关系呢。。闭包一般用在什么场合?
最后那个a开始是赋值为4了,后来进入outerFun,赋值为0就改变了全局作用域的a,所以下面也是0
但下面两个例子和前两个例子有什么关系呢。。闭包一般用在什么场合?
26 楼
kimmking
2009-03-25
1、JavaScript按块来解释执行
2、同一块中,function前后顺序没有关系
3、全局变量的问题,请看hax大神blog的有奖问答帖~~
2、同一块中,function前后顺序没有关系
3、全局变量的问题,请看hax大神blog的有奖问答帖~~
25 楼
丁丁豆
2009-03-25
这不就是一个全局变量和局部变量的问题吗,在实际中应用的不多,所以自我感觉没有必要掌握,只应学习拓展
发表评论
-
HttpServletRequestWrapper 用法
2014-02-14 22:15 14668Servlet规范中所引入的filter令人心动不已,因为它引 ... -
javascript常用 正则
2010-06-14 16:42 2143javascript身份证号验证 正则 //这个可以 ... -
javaScript 计算网页内容的宽与高 (浏览器的标准模式与怪异模式)
2010-01-06 15:07 4334标准模式与怪异模式 ... -
iframe高度自适应、载入完成事件
2009-09-14 17:40 8700高度自适应 ------------------------ ... -
12 ADS.js库(第二版本)
2009-05-11 10:07 3335前面的 第11篇文章 用到了这个版本的ADS.js / ... -
11 自己的JS调试工具 myLogger()对象
2009-05-11 09:58 2220/** * @author elf */ funct ... -
10 javaScript的异常处理 try{ }catch(theException){ }
2009-05-03 15:04 1809例子: try { //一个异常在这里产生 ... -
9 通过call()和apply()重新定义执行环境
2009-05-03 15:02 1633通过前面学习,已知道this对象的环境是如何随着函数被赋值给其 ... -
8 this是什么
2009-04-26 14:55 1935this在javascript中 情况是不同与java c+ ... -
7 编写类
2009-04-25 20:19 1433以前写过类似的例子, 见http://elf8848.itey ... -
6 继承
2009-04-25 19:45 1551javascript 中没有从一个类扩展出另一个类的底层类结构 ... -
5 迭代对象
2009-04-25 19:23 1391我们常用到for循环 var list=[5,6,7, ... -
4 没有重载
2009-04-25 19:11 1542关于"重载"的概念, 就不用说了. ... -
3 创建自己的库 ADS.js(第一版本)
2009-04-25 18:43 2961伪命名空间的使用. 在javascript2.0广泛使 ... -
2 不要检测版本,要检测对象
2009-04-25 13:09 1485为了编写能兼容各种浏览器的 javascript ,我们可能首 ... -
1 在html中包含javascript
2009-04-25 11:10 5483方法一: 通过外部源文件来包含javascript,这是最正 ... -
常用的JS-备份
2009-03-20 08:46 2646我常用 的HTML 类型<!DOCTYPE html ... -
DOM 删除节点
2009-03-13 17:48 3338removeChild() 方法删除指定节点。 ... -
如何使用定时器settimeout、setInterval执行能传递参数的函数
2009-03-11 19:03 15432无论是window.setTimeout还是window.se ... -
JavaScript函数参数个数
2009-03-11 18:51 3962<html><head><met ...
相关推荐
JS闭包可被利用的常见场景。值得保留的文档。值得一看
Javascript 闭包完整解释
js闭包的详细讲解
js闭包的个人理解
Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。
js闭包写法学习demo
网上大多只是讲解js闭包的大概意思和小例子,但真实用于项目中又该怎么用呢。这个例子真实的告诉大家在项目中的用法
JS闭包理解 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问。所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的...
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
资源名称:javascript闭包详解 中文word版 内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...
JavaScript闭包 JavaScript闭包 JavaScript闭包 JavaScript闭包
js闭包和垃圾回收机制示例详解 目录 前言 正文 1.闭包 1.1闭包是什么? 1.2闭包的特性 1.3理解闭包 1.4闭包的主要实现形式 1.5闭包的优缺点 1.6闭包的使用 2.垃圾回收机制 总结 前言 正文 ...
闭包一点即通 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
javaScript无可争议的是如今前台开发最常用的技术,该文档讲解了javaScript中闭包技术,在jquery中大量的使用了该技术,学好可以更好的理解学习jquery。
详解JavaScript闭包问题 闭包是纯函数式编程语言的传统特性之一。通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流JavaScript库...
javaScript闭包技术资料
js闭包的介绍
javascript 闭包实例下载
javascript深入理解js闭包.docx
js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。看上去函数“记住”了外部环境,但其实上是这个函数有个指向外部环境的引用。这就是“闭包”的...