想要彻底理解闭包,就必须理解如何创建作用域链以及作用域链有什么作用。一般情况下,以compare函数为例:functioncompare(val1,val2){returnval1
浅谈JavaScript闭包,小白的JS学习之路!
程序员辰风
javascript学习开发语言
前言在JavaScript中,闭包是一种强大而灵活的特性,它不仅允许变量私有化,而且提供了一种在函数执行完毕后仍然保持对外部作用域变量引用的机制。本文将深入讨论JavaScript闭包的概念、优点、缺点以及如何避免潜在的内存泄漏问题。调用栈与作用域链在理解闭包之前,首先需要了解调用栈和作用域链的概念。调用栈调用栈是用来管理函数调用关系的数据结构。当一个函数执行时,会将其执行上下文推入调用栈,如下图
学习JavaScript闭包和作用域笔记
LHH大翰仔仔
JSJavaScript闭包和作用域闭包JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外一个函数作用域中变量的函数。从概念上,闭包有两个特点:函数能访问另外一个函数的作用域中的变量在ES6之前,JavaScript只有函数作用域的概念,没有块级作用域(但catch捕获的异常,只能在catch中访问)的概念。每个函数都是封闭的,外部访问不到函数作用域中的变量。functionge
JS加密/解密之闭包的运用
mxd01848
javascript开发语言ecmascript
深入探讨JavaScript闭包的演变与应用摘要:本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始,探讨它在JavaScript编程中的重要性,并通过实例展示闭包在不同场景下的灵活应用。引言JavaScript作为一种高度灵活的编程语言,一直以其独特的特性吸引着开发者的注意。其中一个备受推崇的特性便是闭包。闭包作为JavaScript中一个重要的概
JavaScript闭包使用场景
小青头
前端学习jsjavascript函数闭包
JavaScript闭包使用场景闭包就是外层函数将内层函数返回出去,并且内层函数执行时带着外层函数的作用域,可以使用外层函数内部的变量,这些变量始终保存在内存中本质:闭包相当于桥梁,连接函数内核函数外。特点:保存函数的诞生环境使用原因:函数外想要获取函数内部的变量,通过闭包形式注意事项:闭包会将作用域保存在内存中,不用时需要将变量设置为null,防止内存泄漏。闭包的形式返回值形式函数中返回一个函数
JavaScript闭包的基本原理和应用场景
前端筱悦
javascript前端开发语言
一、什么是闭包JavaScript闭包是一种重要的概念,它在JavaScript中起到了重要的作用。它是由函数和函数内部能访问到的变量组合而成的一个实体。简单来说,闭包就是一个函数内部能够访问到外部作用域变量的函数。二、闭包的基本原理闭包的基本原理是JavaScript中的作用域链机制。在JavaScript中,每当创建一个函数时,都会创建一个作用域链,这个作用域链包括当前函数的作用域和所有外层函
探讨JavaScript闭包:10个实用场景解析
前端达人
javascript开发语言ecmascript前端
在JavaScript中,闭包(closure)是一个重要的概念。它不仅是理解JavaScript作用域和作用域链的关键,还是实现一些高级特性和设计模式的基础。闭包在许多场景中都被广泛使用,下面我们来具体讲解闭包的概念和一些经典的使用场景。什么是闭包?闭包是指一个函数能够访问并操作其父函数作用域中的变量,即使该父函数已经执行完毕,离开了执行环境。在JavaScript中,函数内部定义的函数,由于作
javascript——闭包
9979eb0cd854
本文摘录及参考自:1.学习Javascript闭包(Closure)2.闭包的秘密3.JavaScript闭包4.JavaScript深入之闭包5.JavaScript深入之执行上下文5.闭包-JavasScript6.闭包7.闭包,懂不懂由你,反正我是懂了8.什么是闭包,我的理解
JavaScript 闭包
不容君子
javaScriptjavascript前端开发语言
目录全局变量实例实例变量的生命周期一个计数器的困境实例实例实例JavaScript嵌套函数实例JavaScript闭包实例例子解释闭包的概念闭包的特点使用闭包的注意点参考资料JavaScript变量属于本地或全局作用域。全局变量能够通过闭包实现局部(私有)。在了解闭包前我们有必要先理解一些概念。全局变量函数能够访问函数内部定义的所有变量,比如:实例functionmyFunction(){vara
JavaScript闭包实现计数器
追寻者01
JavaScriptjavascript
JavaScript闭包实现计数器因为javascript没有局部作用域,所以可以通过以下的方法实现一个计数器:varadd=(function(){varcounter=0;returnfunction(){returncounter+=1;}})();add();add();add();//结果为3解析:代码从上往下执行varadd=…的时候会执行一次counter的初始化和add的初始化co
javascript闭包及其使用场景
胡西风_foxww
#JavaScript闭包计数器闭包计数器
概念先看一段代码functiont1(){varage=22;functiont2(){alert(age);}returnt2;}vartmp=t1();varage=99;tmp();//22在大部分的语言中,t1被调用执行,则申请内存,并把局部变量push入栈。t1函数执行完毕,内部的局部变量随着函数的退出而销毁。因此,age=22这个局部变量就消失了。但是在js中,age=20这个变量却被
javascript闭包简单实例
bcbobo21cn
web前端JavaScript全局变量私有变量闭包
1闭包实例下图是一个闭包实例;闭包Demo闭包Demo。functiona(){varn=0;this.inc=function(){n++;console.log(n);};}varc=newa();c.inc();//控制台输出1c.inc();//控制台输出2每次运行在控制台输出1和2;有权访问另一个函数作用域内变量的函数都是闭包。这里inc函数访问了构造函数a里面的变量n,所以形成了一个闭
CocosCreator 面试题(三)JavaScript闭包原理和作用
w风雨无阻w
CocosCreator面试题javascript开发语言ecmascriptCocosCreator面试题
1、JavaScript闭包是什么?JavaScript闭包是指在函数内部创建的函数,它可以访问并持有创建它的父函数作用域中的变量,即使父函数已经执行完毕。闭包是JavaScript中强大而有用的概念,它可以用于创建私有变量、实现模块化和封装性,以及解决异步操作中的作用域问题。functionouterFunction(){varouterVariable='Iamfromtheouterfunc
PHP,安卓,UI,java,linux视频教程合集
cocos2d-x小菜
javaUIlinuxPHPandroid
╔-----------------------------------╗┆
zookeeper admin 笔记
braveCS
zookeeper
Required Software
1) JDK>=1.6
2)推荐使用ensemble的ZooKeeper(至少3台),并run on separate machines
3)在Yahoo!,zk配置在特定的RHEL boxes里,2个cpu,2G内存,80G硬盘
数据和日志目录
1)数据目录里的文件是zk节点的持久化备份,包括快照和事务日
Spring配置多个连接池
easterfly
spring
项目中需要同时连接多个数据库的时候,如何才能在需要用到哪个数据库就连接哪个数据库呢?
Spring中有关于dataSource的配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
&nb
Mysql
171815164
mysql
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'IDENTIFIED BY 'mypassword' WI
TH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作
CommonDAO(公共/基础DAO)
g21121
DAO
好久没有更新博客了,最近一段时间工作比较忙,所以请见谅,无论你是爱看呢还是爱看呢还是爱看呢,总之或许对你有些帮助。
DAO(Data Access Object)是一个数据访问(顾名思义就是与数据库打交道)接口,DAO一般在业
直言有讳
永夜-极光
感悟随笔
1.转载地址:http://blog.csdn.net/jasonblog/article/details/10813313
精华:
“直言有讳”是阿里巴巴提倡的一种观念,而我在此之前并没有很深刻的认识。为什么呢?就好比是读书时候做阅读理解,我喜欢我自己的解读,并不喜欢老师给的意思。在这里也是。我自己坚持的原则是互相尊重,我觉得阿里巴巴很多价值观其实是基本的做人
安装CentOS 7 和Win 7后,Win7 引导丢失
随便小屋
centos
一般安装双系统的顺序是先装Win7,然后在安装CentOS,这样CentOS可以引导WIN 7启动。但安装CentOS7后,却找不到Win7 的引导,稍微修改一点东西即可。
一、首先具有root 的权限。
即进入Terminal后输入命令su,然后输入密码即可
二、利用vim编辑器打开/boot/grub2/grub.cfg文件进行修改
v
Oracle备份与恢复案例
aijuans
oracle
Oracle备份与恢复案例
一. 理解什么是数据库恢复当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与
JavaEE开源快速开发平台G4Studio v5.0发布
無為子
我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V5.0版本已经正式发布。
访问G4Studio网站
http://www.g4it.org
2013-04-06 发布G4Studio_V5.0版本
功能新增
(1). 新增了调用Oracle存储过程返回游标,并将游标映射为Java List集合对象的标
Oracle显示根据高考分数模拟录取
百合不是茶
PL/SQL编程oracle例子模拟高考录取学习交流
题目要求:
1,创建student表和result表
2,pl/sql对学生的成绩数据进行处理
3,处理的逻辑是根据每门专业课的最低分线和总分的最低分数线自动的将录取和落选
1,创建student表,和result表
学生信息表;
create table student(
student_id number primary key,--学生id
优秀的领导与差劲的领导
bijian1013
领导管理团队
责任
优秀的领导:优秀的领导总是对他所负责的项目担负起责任。如果项目不幸失败了,那么他知道该受责备的人是他自己,并且敢于承认错误。
差劲的领导:差劲的领导觉得这不是他的问题,因此他会想方设法证明是他的团队不行,或是将责任归咎于团队中他不喜欢的那几个成员身上。
努力工作
优秀的领导:团队领导应该是团队成员的榜样。至少,他应该与团队中的其他成员一样努力工作。这仅仅因为他
js函数在浏览器下的兼容
Bill_chen
jquery浏览器IEDWRext
做前端开发的工程师,少不了要用FF进行测试,纯js函数在不同浏览器下,名称也可能不同。对于IE6和FF,取得下一结点的函数就不尽相同:
IE6:node.nextSibling,对于FF是不能识别的;
FF:node.nextElementSibling,对于IE是不能识别的;
兼容解决方式:var Div = node.nextSibl
【JVM四】老年代垃圾回收:吞吐量垃圾收集器(Throughput GC)
bit1129
垃圾回收
吞吐量与用户线程暂停时间
衡量垃圾回收算法优劣的指标有两个:
吞吐量越高,则算法越好
暂停时间越短,则算法越好
首先说明吞吐量和暂停时间的含义。
垃圾回收时,JVM会启动几个特定的GC线程来完成垃圾回收的任务,这些GC线程与应用的用户线程产生竞争关系,共同竞争处理器资源以及CPU的执行时间。GC线程不会对用户带来的任何价值,因此,好的GC应该占
J2EE监听器和过滤器基础
白糖_
J2EE
Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。
监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。
ServletContex监听器
ServletContex又叫application
博弈AngularJS讲义(16) - 提供者
boyitech
jsAngularJSapiAngularProvider
Angular框架提供了强大的依赖注入机制,这一切都是有注入器(injector)完成. 注入器会自动实例化服务组件和符合Angular API规则的特殊对象,例如控制器,指令,过滤器动画等。
那注入器怎么知道如何去创建这些特殊的对象呢? Angular提供了5种方式让注入器创建对象,其中最基础的方式就是提供者(provider), 其余四种方式(Value, Fac
java-写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。
bylijinnan
java
public class CommonSubSequence {
/**
* 题目:写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。
* 写一个版本算法复杂度O(N^2)和一个O(N) 。
*
* O(N^2):对于a中的每个字符,遍历b中的每个字符,如果相同,则拷贝到新字符串中。
* O(
sqlserver 2000 无法验证产品密钥
Chen.H
sqlwindowsSQL ServerMicrosoft
在 Service Pack 4 (SP 4), 是运行 Microsoft Windows Server 2003、 Microsoft Windows Storage Server 2003 或 Microsoft Windows 2000 服务器上您尝试安装 Microsoft SQL Server 2000 通过卷许可协议 (VLA) 媒体。 这样做, 收到以下错误信息CD KEY的 SQ
[新概念武器]气象战争
comsci
气象战争的发动者必须是拥有发射深空航天器能力的国家或者组织....
原因如下:
地球上的气候变化和大气层中的云层涡旋场有密切的关系,而维持一个在大气层某个层次
oracle 中 rollup、cube、grouping 使用详解
daizj
oraclegroupingrollupcube
oracle 中 rollup、cube、grouping 使用详解 -- 使用oracle 样例表演示 转自namesliu
-- 使用oracle 的样列库,演示 rollup, cube, grouping 的用法与使用场景
--- ROLLUP , 为了理解分组的成员数量,我增加了 分组的计数 COUNT(SAL)
技术资料汇总分享
Dead_knight
技术资料汇总 分享
本人汇总的技术资料,分享出来,希望对大家有用。
http://pan.baidu.com/s/1jGr56uE
资料主要包含:
Workflow->工作流相关理论、框架(OSWorkflow、JBPM、Activiti、fireflow...)
Security->java安全相关资料(SSL、SSO、SpringSecurity、Shiro、JAAS...)
Ser
初一下学期难记忆单词背诵第一课
dcj3sjt126com
englishword
could 能够
minute 分钟
Tuesday 星期二
February 二月
eighteenth 第十八
listen 听
careful 小心的,仔细的
short 短的
heavy 重的
empty 空的
certainly 当然
carry 携带;搬运
tape 磁带
basket 蓝子
bottle 瓶
juice 汁,果汁
head 头;头部
截取视图的图片, 然后分享出去
dcj3sjt126com
OSObjective-C
OS 7 has a new method that allows you to draw a view hierarchy into the current graphics context. This can be used to get an UIImage very fast.
I implemented a category method on UIView to get the vi
MySql重置密码
fanxiaolong
MySql重置密码
方法一:
在my.ini的[mysqld]字段加入:
skip-grant-tables
重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql
mysql>use mysql;
mysql>更新 user set password=password('新密码') WHERE User='root';
mysq
Ehcache(03)——Ehcache中储存缓存的方式
234390216
ehcacheMemoryStoreDiskStore存储驱除策略
Ehcache中储存缓存的方式
目录
1 堆内存(MemoryStore)
1.1 指定可用内存
1.2 驱除策略
1.3 元素过期
2 &nbs
spring mvc中的@propertysource
jackyrong
spring mvc
在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了:
@PropertySource 在spring 3.1中开始引入
比如有配置文件
config.properties
mongodb.url=1.2.3.4
mongodb.db=hello
则代码中
@PropertySource(&
重学单例模式
lanqiu17
单例Singleton模式
最近在重新学习设计模式,感觉对模式理解更加深刻。觉得有必要记下来。
第一个学的就是单例模式,单例模式估计是最好理解的模式了。它的作用就是防止外部创建实例,保证只有一个实例。
单例模式的常用实现方式有两种,就人们熟知的饱汉式与饥汉式,具体就不多说了。这里说下其他的实现方式
静态内部类方式:
package test.pattern.singleton.statics;
publ
.NET开源核心运行时,且行且珍惜
netcome
java.net开源
背景
2014年11月12日,ASP.NET之父、微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET 扩展为可在 Linux 和 Mac OS 平台上运行。.NET核心运行时将基于MIT开源许可协议发布,其中将包括执行.NET代码所需的一切项目——CLR、JIT编译器、垃圾收集器(GC)和核心
使用oscahe缓存技术减少与数据库的频繁交互
Everyday都不同
Web高并发oscahe缓存
此前一直不知道缓存的具体实现,只知道是把数据存储在内存中,以便下次直接从内存中读取。对于缓存的使用也没有概念,觉得缓存技术是一个比较”神秘陌生“的领域。但最近要用到缓存技术,发现还是很有必要一探究竟的。
缓存技术使用背景:一般来说,对于web项目,如果我们要什么数据直接jdbc查库好了,但是在遇到高并发的情形下,不可能每一次都是去查数据库,因为这样在高并发的情形下显得不太合理——
Spring+Mybatis 手动控制事务
toknowme
mybatis
@Override
public boolean testDelete(String jobCode) throws Exception {
boolean flag = false;
&nbs
菜鸟级的android程序员面试时候需要掌握的知识点
xp9802
android
熟悉Android开发架构和API调用
掌握APP适应不同型号手机屏幕开发技巧
熟悉Android下的数据存储
熟练Android Debug Bridge Tool
熟练Eclipse/ADT及相关工具
熟悉Android框架原理及Activity生命周期
熟练进行Android UI布局
熟练使用SQLite数据库;
熟悉Android下网络通信机制,S
forex88 说:
讲的很清楚明了,连我都懂了,要是我们大学时的老师也能这么讲课。。。他们只会放幻灯片
2009年8月30日 22:29 | 档案 | 引用
明城 说:
这里有个 PPT 用于说明 JS 闭包,说明得很透彻: http://www.gracecode.com/archives/2385/
2009年8月30日 22:44 | 档案 | 引用
张昭 说:
呵呵,可以作为面试题了!
2009年8月31日 09:30 | 档案 | 引用
十三 说:
闭包个人感觉是一种描述函数内部的数据结构,来描述函数的运行上下文.Javascript编程精粹 这本书算是讲的比较好一点.
2009年8月31日 09:40 | 档案 | 引用
迷途小书童 说:
类是有行为的数据,闭包是有数据的行为。
2009年8月31日 10:26 | 档案 | 引用
tt 说:
阮兄:
有点疑问:
function f1(){
n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
可以写成如下的不也一样么?
function f1(){
n=999;
return n;
}
var result=f1();
alert(result);
2009年8月31日 21:16 | 档案 | 引用
明城 说:
@tt 实际上后种方法每次调用 f1 时,都会声明 n = 999,而且 n 无法保留状态值(严格按照你的代码,其实 n 为全局变量,我理解你的本意为 var n = 999;)。
而第一种 f1 实际上返回的是个匿名函数,这样 n 作用域被另外个 f2 函数作用域所使用,因此它会保留。n 不会被重复声明,且内容会被保存
2009年9月 1日 13:20 | 档案 | 引用
SpiderMan 说:
感觉这里的例子更好一些 https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Closures
2009年9月 1日 20:46 | 档案 | 引用
ahwing 说:
这是我见过最简单易懂的闭包教程。
支持下。
博主的博客写的不错,简单易懂,东西涉及的很多方面我都有兴趣,看来是同道中人,^_^
2009年9月 2日 16:49 | 档案 | 引用
星光 说:
一文中的!!!!!!!!!!!!
学习了!!
2009年9月 3日 11:08 | 档案 | 引用
zhaorui 说:
想知道思考题的答案,
我以为是:My Object
2009年9月15日 00:09 | 档案 | 引用
steven 说:
顶楼主,我读了一些文章。不是特明白。
有个问题。
记得有人说。外面的函数是closure,
好像楼主说里面的函数是closure.
不知道到底哪个是?谢谢。
2009年11月21日 14:51 | 档案 | 引用
jkd___w 说:
楼主讲讲最后一个思考题,没明白
2009年11月26日 09:21 | 档案 | 引用
hou 说:
请版主讲一讲最后一个例子怎么回事,没有看明白
2009年11月30日 16:00 | 档案 | 引用
George Wing 说:
函数中的this一般是指向window中的变量。
2009年12月13日 09:55 | 档案 | 引用
George Wing 说:
上面本人说得不太正确。
this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的。
2009年12月13日 10:23 | 档案 | 引用
George Wing 说:
如果非要指向object,可显式的控制--把代码的最后一句改为 alert(object.getName().call(object));
2009年12月13日 11:39 | 档案 | 引用
c-star 说:
阮大哥讲的很透彻 受益匪浅
2009年12月18日 16:32 | 档案 | 引用
ya 说:
大道至简,给予我这个初学者很大的帮助,谢谢!
2010年1月11日 09:30 | 档案 | 引用
过客 说:
浅显易懂,很好。
如下看法,认为有待商榷:
#1、有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
#2、这段代码中另一个值得注意的地方,就是“nAdd=function(){n+=1}”这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
function f1(){
test = 10;
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
//如果 #1 说法正确,下句会打印10,实际结果是test未定义。
//alert(test); // error test 未定义
//如果 #2 正确,语句 nAdd(); 位置在何处应该都能执行,测试结果在下面这个位置,也就是语句 var result=f1(); 前。是不能执行的。
//nAdd();
var result=f1();
result(); // 999
nAdd();
result(); // 1000
2010年1月28日 11:36 | 档案 | 引用
ning 说:
To 过客:
函数内部定义的方法和变量,要等到函数执行过以后,才会真正定义
2010年3月20日 16:17 | 档案 | 引用
Jason 说:
但是从过客说的里面可以引出另外的问题,当使用这样的代码时。
然后调用 则显示为999。说明nAdd中的n确实是作为全局变量存在。于是问题就来了——有什么方法让他可以是父函数中定义的n呢?function f1(){
test = 10;
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
如果在函数f1定义之前添加变量定义
2010年4月26日 15:28 | 档案 | 引用
西子湖畔的树人 说:
大道至简,很不错!~ 这篇文章我要转了...
2010年4月28日 22:48 | 档案 | 引用
iworm 说:
this关键字代表的实例会根据环境不同而变化的. 他总是指向owner 看看这篇你大概就动this这个关键字了
http://www.quirksmode.org/js/this.html
2010年4月29日 12:34 | 档案 | 引用
tomwang 说:
最后一个题感觉和闭包没什么关系啊,能详细解释一下吗?因为当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,这在《Javascript权威指南》上说的很清楚,所以答案肯定是“The Window”,和闭包没什么关系啊
2010年5月23日 18:24 | 档案 | 引用
afity 说:
最后一题重点在this
2010年8月25日 23:26 | 档案 | 引用
bao 说:
如果把f2申明成全局变量,道理一样吗?
2010年9月 6日 17:45 | 档案 | 引用
小猫 说:
太经典了!
终于理解了,一箭双雕啊!既理解了this的用法,又理解了闭包
2010年9月16日 20:22 | 档案 | 引用
soberlevi 说:
这个例子很不错,真的是一箭双雕
2010年10月15日 09:29 | 档案 | 引用
小彘 说:
前面讲得挺好的,浅显易懂。对最后的两个例子搞不清楚为啥。版主能不能具体分析下。
var obj=function()
{
var MyFunc=function()
{
alert("hello world");
}
return function()
{
return MyFunc;
}
}()
var f3=obj();
var f4=obj();
alert(f3 === f4);//为啥是TRUE;搞不懂
2010年10月24日 09:39 | 档案 | 引用
hellowang 说:
最后两个例子很精炼 ^ ^
2010年11月11日 15:24 | 档案 | 引用
陈锐达 说:
尝试解答代码段一:
getNameFunc: function() {//假设函数名为A
return function()/*假设函数名为B*/ { return this.name; };
}
在函数里面构建函数的时候,闭包产生。
在函数B内调用函数A的this.name,由于函数A没有name属性,所以就去找全局变量name,找到了,所以返回“The Window”,要是没有找到,则返回“undefined”。
代码段二可以尝试将代码更改为:
var _this = this;
return function() { return _this.name +"__"+ this.name; };
2010年12月13日 15:50 | 档案 | 引用
LuckyGeb 说:
只有一点没弄懂,如下代码,nAdd在函数外为什么可以有意义?而test不行?想了好久,不知道那里有解答
function f1(){
test=10;
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
2011年1月17日 01:17 | 档案 | 引用
qdsang 说:
通俗易懂,, 阅览无数教程, 看了这篇, 终于明白了点.
2011年1月24日 13:21 | 档案 | 引用
sf 说:
写得太好了
2011年2月15日 16:47 | 档案 | 引用
Luke 说:
这篇文章是阮兄一贯的风格,我喜欢,不过 "Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。"这句有点奇怪,c不一样可以在函数内部直接读取全局变量么?难道不是么?
2011年3月 2日 22:02 | 档案 | 引用
ignition 说:
阮大哥能不能具体讲下最后的思考题啊? 感觉关键在this
2011年3月 8日 15:56 | 档案 | 引用
三少爷 说:
变量的作用域无非就是两种:全局变量和局部变量。
这句话值得商榷, 变量的作用域确实只有两种, 不过他们是全局对象和函数.
你想说的或许是变量的类型有两种?
2011年3月25日 20:15 | 档案 | 引用
轩脉刃 说:
理解最后两个例子:
1 函数中的this指的是调用这个函数的owner
2 object.getNameFunc()是返回一个函数,并没有执行函数中的代码
3 增加一个例子0:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return (this.name);
}
};
var name = object.getNameFunc();
alert(name);
4 把例子1变成
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name; //这个this是有上下文的限制的
};
}
};
var tmp = Object.getNameFunc(); //此时没有执行this.name
var name = tmp();//这个时候才执行,这时候的this上下文为全局
alert(name);
//alert(object.getNameFunc()())
5 把例子2变成:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
var tmp = Object.getNameFunc(); //这个时候执行了that = this,这里的this上下文是object,所以that指的是object
var name = Object.getNameFunc(); //这个时候执行了that.name
alert(name);
//alert(object.getNameFunc()());
2011年4月19日 15:28 | 档案 | 引用
小秦 说:
你自己描述的是 f1()() 显示的是999,说明 n 是使用的f1内部的变量n,而非是全局变量n,不知道你为什么会有
这种想法呢? 如果想在nAdd中使用全局变量n(即在函数外面定义的n)的话,使用window.n来访问.2011年4月20日 14:56 | 档案 | 引用
小秦 说:
楼主文章中的:
这一整大段中的
根据整篇文章所表达的内容,应该为:
因为如果没有加var,则声明的是全局变量,既然是全局变量,则在所有函数内部都是可见的,也就不会存在闭包这种说法.
请求楼主修正.
2011年4月20日 15:02 | 档案 | 引用
小秦 说:
因为f3和f4都指向同一个地址(即MyFunc).
2011年4月20日 15:05 | 档案 | 引用
小洪 说:
我测试了一下,为什么第一个例子输出的什么都没有是null,第二个我理解是myobject。谁能解释下
2011年4月20日 16:48 | 档案 | 引用
Ruan YiFeng 说:
谢谢指出,已更正。
2011年4月20日 16:53 | 档案 | 引用
sitearth 说:
起初以为函数内用var声明变量,就等于用了this声明,其实不是
var w=100;
function f1(){
//var w=101;
//this.w=102;
function f2(){
document.write(this.w);
}
return f2;
}
f1()();
输出:100
var w=100;
function f1(){
var w=101;
//this.w=102;
function f2(){
document.write(this.w);
}
return f2;
}
f1()();
输出:100
var w=100;
function f1(){
w=101;
//this.w=102;
function f2(){
document.write(this.w);
}
return f2;
}
f1()();
输出:101
var w=100;
function f1(){
//var w=101;
this.w=102;
function f2(){
document.write(this.w);
}
return f2;
}
f1()();
输出:102
看起来函数中的var和this并不是一个概念,函数内的局部变量与函数的属性不是一回事,不过通过上面的情况能够加深理解this和闭包
2011年4月22日 11:27 | 档案 | 引用
Aizen 说:
很不错的讲解,楼主写的通俗易懂,很棒的理解,很受用!我的qq:290913917 希望有机会成为共同研究javascript和html5的伙伴,谢谢!
2011年5月 1日 00:10 | 档案 | 引用
lily 说:
我感觉第一个思考题是不是这样理解:
首先this指向的是当前运行该函数的对象,
1、object.getNameFunc()得到了一个函数,函数为function(){return this.name}
2、object.getNameFunc()(),此时为window运行该函数,所以this指向的是window,所以this.name为The window
2011年5月 4日 11:29 | 档案 | 引用
foxracle 说:
做习题之前有一点需要很清楚:
内部函数可以访问定义它们的外部函数的参数和变量(除了this和arguments之外)
如果需要访问对象的name属性的话,就需要显示的定义一个变量that来引用this,而这个变量此时就指向object对象了。
第一题改成下面这样就很清楚了。getNameFunc的第一个()是属于方法调用,所以this绑定到了object对象,自然this.name为"My Object",但是闭包函数无法访问这个this,它只能访问到全局的this。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
alert(this.name);
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
2011年5月23日 15:44 | 档案 | 引用
CODER 说:
写的真不错。。。看了很多文章讲闭包都是云里雾里的。。看了本文才恍然大悟。。。哦原来闭包如此简单。。。。楼主写的不错。。。
2011年6月 2日 15:56 | 档案 | 引用
小超 说:
前面讲的我都明白,但是最后两个例子还是不明白,好多处都不懂!
1. var object = {。。。} 这是在干什么?是在声明一个变量?还是在声明一个类,然后里面有许多属性?
2 . object.getNameFunc()(); 怎么会有两个括号?
3. 如何判断 this指向的是object 对象还是全局对象 ?
2011年6月14日 16:30 | 档案 | 引用
anoymous 说:
闭包是运行时中的概念,不能讲哪个函数是一个闭包!而是哪个函数在运行时存在一个闭包!有时候,好几个函数都可以组成一个闭包呢:
function ff()
{
var local=1;
this.add1=function()
{
return ++local;
};
this.add2=function()
{
return ++local;
}
}
var f=new ff();
alert(f.add1());//2
alert(f.add2());//3
2011年6月24日 14:33 | 档案 | 引用
Joe 说:
最后两个例子中,第一个其实不是闭包,第二个是,但第二个例子其实不用那么复杂,直接把第一个例子中的this去掉就可以了。
2011年7月25日 14:02 | 档案 | 引用
Revo 说:
为什么第一个运行以后结果是result?!既不是window也不是object....???
2011年8月12日 15:31 | 档案 | 引用
转自:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html