昨天在做Chrome扩展的时候,又遇到闭包问题了,这样写function(){}里面的i总是最后一个。functiongenRankList(s){varobj=JSON.parse(s);varlist=obj.rank.list;for(i=0;i
JS闭包
zhangjingbibibi
js闭包跟this指向的理解。js闭包可以读到函数内部的变量变量的值可以一直保存在内存中函数执行后,不会delete变量为了让自己不忘记,下面记录2段codevarname="TheWindow";varobject={name:"MyObject",getNameFunc:function(){returnfunction(){returnthis.name;};}};alert(object.
关于闭包的理解
热情市民阿俊
js闭包会把想要改变的属性隐藏在函数内,则外界完完全全是没有办法访问到那个属性的,只有在该函数返回的另一个函数中访问得到,这是由于js函数作用域链的缘故。一般我们使用闭包不外乎几个原因:将变量隐藏,防止外部访问,利用闭包作为唯一的操作数据的接口减少全局变量的使用,而用闭包变量缓存数据我们一般使用一个对象去接收也就是获取返回函数的引用,如下是多次调用原函数和使用对象接收的区别使用原函数letf=fu
js闭包作用问题解决应用,javascript中闭包的定义
gpt886
智能写作
本篇文章给大家谈谈js中的闭包到底是什么啊,以及js闭包作用问题解决应用,希望对各位有所帮助,不要忘了收藏本站喔。英文|https://betterprogramming.pub/10-java-closure-challenges-explained-with-diagrams-c964110805e7翻译|杨小爱闭包是函数式编程中的核心概念之一,是每个JavaScript开发人员必备的知识。在
js闭包的必要条件及创建和消失(生命周期)
俊哥前端工程师
JavaScript相关语法javascript开发语言ecmascript前端html5chromees6
>创建闭包的必要条件:1.函数嵌套2.内部函数引用外部函数的变量3.将内部函数作为返回值返回>闭包是什么?就是可以访问外部函数(作用域)中变量的内部函数>闭包是什么时候产生的?-当调用外部函数时,闭包就已经创建了-外部函数每调用一次就会产生一个闭包,闭包和闭包之间是相互独立的>闭包是怎么消失的?-直到内部函数被GC(垃圾回收)后才消失functionouter(){varn=0;functioni
目前为止遇到的前端面试题
Doreennn
1,完整的http请求图片发自App2,bfc的了解3,vue双向绑定原理4,ajax和axios是什么,区别?5,js闭包是什么(我记不住啊)6,xss攻击(跨站脚本攻击)的了解7,webpack的loader和plusin的区别8,apply,post,get?的了解(记不住问题了,貌似凡科面试时问了这个)9,promise的了解
js闭包原理及其应用场景
微个日光日
web前端javascript
闭包这个概念一直困扰这我,很多时候背了,过段时间又记不住了。之所以这样是因为自己并没有真正理解什么是闭包。很多时候你觉得一个概念很复杂记不住,很有可能是你对这个概念理解错了。很多人会说闭包会造成内存泄露,其实这是错误的。之所以会造成内存泄露是因为IE浏览器造成的,并不是所有浏览器都会这样。通常之所以会造成内存泄露,是因为浏览器保存了没有被引用的变量,但是闭包的本地变量是被引用和使用的,就不存在内存
内存泄漏/js闭包/垃圾回收机制
漆钰
js垃圾回收机制/内存泄漏闭包本身不会造成内存泄漏,过多的引用会造成内存泄漏个人理解,闭包是能能够通过该函数去访问函数内部变量,形式上是一个函数内部返回一个函数。匿名函数执行的时候会自动释放functiona(){varb=10;returnfunction(){return++b;}}a()();//11//匿名执行的内存释放掉,赋值执行的作用域[[scope]][0]闭包中保留f变量conso
带你一分钟理解JS闭包——通俗易懂
爱编程的妹子
网上关于闭包的文章有很多,但是大多数都使用了太多专业术语,不便于理解,我在这试着用通俗一点的语言解释一下何为闭包。什么是闭包?什么是闭包?闭包是什么?先来看一段代码:functiona(){varn=0;functioninc(){n++;console.log(n);}inc();inc();}a();//控制台输出1,再输出2再看另一段代码:functiona(){varn=0;this.in
js闭包为什么可以实现点击li标签弹出对应的索引值,详解(一看就会)
猫豆豆
javascript前端开发语言
一.问题描述1,问题:js实现点击li标签弹出对应的索引值2,实现代码如下:3,现象:我们这时还没有点击li标签哦,此时打印看看li标签上的onclick事件绑定的函数分别长什么样子,如下图:结果:这个时候i值为4,四个函数是一样的,都是console.log(i)4,接下来的动作就是要点击li标签啦,会执行各自的函数,但是在i值为4的情况下,这个时候点击标签,打印的结果可想而知,都是4.二:闭包
mianshiyan资料汇总(整理后)
飘然离去
javascript
前端优化方式css3html5Turbopackes6的新特性BigIntcdnWebComponent作用域和执行上下文JS的堆栈内存分配js垃圾回收机制,v8的垃圾回收机制,v8引擎为啥快前端路由hash和history的区别前端攻击反爬虫加密跨域cookiesessionjwt相关Js闭包实际的用途原型链防抖与节流的区别大数据量的解决方案get方法和post方法RPC与HTTP的区别与联系f
JS闭包的理解及常见应用场景
前端同学
jsjavascript
闭包的概念闭包是指有权访问另一个函数作用域中的变量的函数,本质也就是在函数里面返回一个函数一般就是一个函数A,return其内部的函数B,被return出去的B函数能够在外部访问A函数内部的变量,这时候就形成了一个B函数的变量背包,A函数执行结束后这个变量背包也不会被销毁,并且这个变量背包在A函数外部只能通过B函数访问。闭包形成的原理延长作用域链,当前作用域可以访问上级作用域中的变量闭包解决的问题
js闭包之应用场景
weixin_33912638
javascriptViewUI
闭包的解释当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数“。所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。闭包的特点:1)作为一个函数变量的一个引用,当函数返回时,其处于激活状态。2)一个闭包就是当一个函数返回时,一个没有释放资
js闭包的9个使用场景
书中自有妍如玉
前端javascript开发语言ecmascript
一个函数的作用域可以访问另一个函数的局部变量,这个变量所在的函数就是闭包函数。闭包使得内部函数可以访问外部函数的属性(变量或方法)1.返回值functionfn(){letname="123";returnfunction(){returnname;}}letfnc=fn();console.log(fnc());//123//以闭包的行事将name变量返回;或者:console.log(fn()
js闭包使用场景
wzj_cool
js踩坑js闭包的使用场景
https://www.cnblogs.com/jianghao233/p/8992289.html
js闭包及其应用场景
leo
javascriptjavascript
目录前言一、什么是闭包?二、闭包的使用1.最简单的闭包函数三、闭包应用场景及优缺点1.使用场景2.优点3.缺点总结前言今天来讲一讲什么是闭包以及闭包的使用场景,从概念入手,通过案例来引申出闭包的优缺点及使用场景,还不会的话快来一探究竟~一、什么是闭包?MDN官方概念闭包是函数和声明该函数的词法环境的组合通俗的理解内层函数,引用外层函数上的变量,就可以形成闭包二、闭包的使用1.最简单的闭包函数如下案
JS闭包的应用场景
糕冷鲨手
javascript前端开发语言
什么是闭包?闭包的基本定义闭包是指有权访问另一个函数作用域中变量的函数。如果一个函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包。闭包会创建一个包含外部函数作用域变量的环境,并将其保存在内存中,这意味着,即使外部函数已经执行完毕,闭包依然可以访问和使用外部函数的变量简单理解就是,一个作用域可以访问另一个函数内部的局部变量//闭包实例代码functionfn(){letnum=
JS闭包实例
sicnu_meimei
关于闭包我也是初学者,所以对闭包的理解还不是很透彻,以下几个例子是我通过红宝书上的例子改变了一下,可能对大家学习闭包会有更透彻的帮助。例1//object2把闭包赋值给数组//object2把闭包赋值给数组varobject2={createFunctions:function(){varresult=newArray();for(vari=0;i<10;i++){result[i]=functi
JS闭包与内存泄漏
老鼠AI大米_Java全栈
内存泄露是指你「用不到」(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。闭包里面的变量就是我们需要的变量,不能说是内存泄露。闭包是什么?闭包(closure)指有权访问另一个函数作用域中变量的函数。-----JavaScript高级程序设计闭包有什么用?延伸变量作用域范围,读取函数内部的变量让这些变量的值始终保持在内存中简单理解就是,一个作用域可以访问另外一个函数内部的局部变量。闭包案
JS 闭包的实现原理
刘翔UP
js
JS闭包的实现原理函数都有自己的执行环境,该环境定义了变量或者函数访问数据的权限,当离开执行环境后,该环境内的变量会被销毁。functionadd(){leta=1;console.log(a);//1}console.log(a);//ReferenceError:aisnotdefined上例a在add()函数的作用域内,能够访问,离开作用域后,就无法访问了。那有没有办法在add()函数外访问
Js闭包的实现原理和作用
BrianXX
js
闭包的实现原理和作用1、闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数。2、闭包的作用:访问函数内部变量、保持函数在环境中一直存在,不会被垃圾回收机制处理因为函数内部声明的变量是局部的,只能在函数内部访问到,但是函数外部的变量是对函数内部可见的,这就是作用域链的特点了。子级可以向父级查找变量,逐级查找,找到为止因此我们可以在函数内部再创建一个函数,这样
js闭包深入浅出
不知名秋刀鱼
javascript前端
理解:从作用域的访问规则定义的:当一个函数作用域包裹一个作用域,内层访问外层变量从语法角度定义:1.嵌套函数,内层函数return2.嵌套函数,内层函数被返回出去,外部访问内层变量3.再一个函数内部定义一个函数,内部函数一致保持对外部函数作用用于的访问。4.能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函
mondb入手
木zi_鸣
mongodb
windows 启动mongodb 编写bat文件,
mongod --dbpath D:\software\MongoDBDATA
mongod --help 查询各种配置
配置在mongob
打开批处理,即可启动,27017原生端口,shell操作监控端口 扩展28017,web端操作端口
启动配置文件配置,
数据更灵活 
大型高并发高负载网站的系统架构
bijian1013
高并发负载均衡
扩展Web应用程序
一.概念
简单的来说,如果一个系统可扩展,那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集,并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种:
1.
DISPLAY变量和xhost(原创)
czmmiao
display
DISPLAY
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0
获取B/S客户端IP
周凡杨
java编程jspWeb浏览器
最近想写个B/S架构的聊天系统,因为以前做过C/S架构的QQ聊天系统,所以对于Socket通信编程只是一个巩固。对于C/S架构的聊天系统,由于存在客户端Java应用,所以直接在代码中获取客户端的IP,应用的方法为:
String ip = InetAddress.getLocalHost().getHostAddress();
然而对于WEB
浅谈类和对象
朱辉辉33
编程
类是对一类事物的总称,对象是描述一个物体的特征,类是对象的抽象。简单来说,类是抽象的,不占用内存,对象是具体的,
占用存储空间。
类是由属性和方法构成的,基本格式是public class 类名{
//定义属性
private/public 数据类型 属性名;
//定义方法
publ
android activity与viewpager+fragment的生命周期问题
肆无忌惮_
viewpager
有一个Activity里面是ViewPager,ViewPager里面放了两个Fragment。
第一次进入这个Activity。开启了服务,并在onResume方法中绑定服务后,对Service进行了一定的初始化,其中调用了Fragment中的一个属性。
super.onResume();
bindService(intent, conn, BIND_AUTO_CREATE);
base64Encode对图片进行编码
843977358
base64图片encoder
/**
* 对图片进行base64encoder编码
*
* @author mrZhang
* @param path
* @return
*/
public static String encodeImage(String path) {
BASE64Encoder encoder = null;
byte[] b = null;
I
Request Header简介
aigo
servlet
当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫“Content-Length”的请求头(Request Header) 用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如:
HttpClient4.3 创建SSL协议的HttpClient对象
alleni123
httpclient爬虫ssl
public class HttpClientUtils
{
public static CloseableHttpClient createSSLClientDefault(CookieStore cookies){
SSLContext sslContext=null;
try
{
sslContext=new SSLContextBuilder().l
java取反 -右移-左移-无符号右移的探讨
百合不是茶
位运算符 位移
取反:
在二进制中第一位,1表示符数,0表示正数
byte a = -1;
原码:10000001
反码:11111110
补码:11111111
//异或: 00000000
byte b = -2;
原码:10000010
反码:11111101
补码:11111110
//异或: 00000001
java多线程join的作用与用法
bijian1013
java多线程
对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means t
Java发送http请求(get 与post方法请求)
bijian1013
javaspring
PostRequest.java
package com.bijian.study;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURL
【Struts2二】struts.xml中package下的action配置项默认值
bit1129
struts.xml
在第一部份,定义了struts.xml文件,如下所示:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts
【Kafka十三】Kafka Simple Consumer
bit1129
simple
代码中关于Host和Port是割裂开的,这会导致单机环境下的伪分布式Kafka集群环境下,这个例子没法运行。
实际情况是需要将host和port绑定到一起,
package kafka.examples.lowlevel;
import kafka.api.FetchRequest;
import kafka.api.FetchRequestBuilder;
impo
nodejs学习api
ronin47
nodejs api
NodeJS基础 什么是NodeJS
JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。
每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了docum
java-64.寻找第N个丑数
bylijinnan
java
public class UglyNumber {
/**
* 64.查找第N个丑数
具体思路可参考 [url] http://zhedahht.blog.163.com/blog/static/2541117420094245366965/[/url]
*
题目:我们把只包含因子
2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14
二维数组(矩阵)对角线输出
bylijinnan
二维数组
/**
二维数组 对角线输出 两个方向
例如对于数组:
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 },
slash方向输出:
1
5 2
9 6 3
13 10 7 4
14 11 8
15 12
16
backslash输出:
4
3
[JWFD开源工作流设计]工作流跳跃模式开发关键点(今日更新)
comsci
工作流
既然是做开源软件的,我们的宗旨就是给大家分享设计和代码,那么现在我就用很简单扼要的语言来透露这个跳跃模式的设计原理
大家如果用过JWFD的ARC-自动运行控制器,或者看过代码,应该知道在ARC算法模块中有一个函数叫做SAN(),这个函数就是ARC的核心控制器,要实现跳跃模式,在SAN函数中一定要对LN链表数据结构进行操作,首先写一段代码,把
redis常见使用
cuityang
redis常见使用
redis 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
引入jar包 jedis-2.1.0.jar (本文下方提供下载)
package redistest;
import redis.clients.jedis.Jedis;
public class Listtest
配置多个redis
dalan_123
redis
配置多个redis客户端
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo
attrib命令
dcj3sjt126com
attr
attrib指令用于修改文件的属性.文件的常见属性有:只读.存档.隐藏和系统.
只读属性是指文件只可以做读的操作.不能对文件进行写的操作.就是文件的写保护.
存档属性是用来标记文件改动的.即在上一次备份后文件有所改动.一些备份软件在备份的时候会只去备份带有存档属性的文件.
Yii使用公共函数
dcj3sjt126com
yii
在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过程其实更方便。 在入口文件index.php里添加 require_once('protected/function.php'); 即可对其引用,成为公用的函数集合。 function.php如下:
<?php /** * This is the shortcut to D
linux 系统资源的查看(free、uname、uptime、netstat)
eksliang
netstatlinux unamelinux uptimelinux free
linux 系统资源的查看
转载请出自出处:http://eksliang.iteye.com/blog/2167081
http://eksliang.iteye.com 一、free查看内存的使用情况
语法如下:
free [-b][-k][-m][-g] [-t]
参数含义
-b:直接输入free时,显示的单位是kb我们可以使用b(bytes),m
JAVA的位操作符
greemranqq
位运算JAVA位移<<>>>
最近几种进制,加上各种位操作符,发现都比较模糊,不能完全掌握,这里就再熟悉熟悉。
1.按位操作符 :
按位操作符是用来操作基本数据类型中的单个bit,即二进制位,会对两个参数执行布尔代数运算,获得结果。
与(&)运算:
1&1 = 1, 1&0 = 0, 0&0 &
Web前段学习网站
ihuning
Web
Web前段学习网站
菜鸟学习:http://www.w3cschool.cc/
JQuery中文网:http://www.jquerycn.cn/
内存溢出:http://outofmemory.cn/#csdn.blog
http://www.icoolxue.com/
http://www.jikexue
强强联合:FluxBB 作者加盟 Flarum
justjavac
r
原文:FluxBB Joins Forces With Flarum作者:Toby Zerner译文:强强联合:FluxBB 作者加盟 Flarum译者:justjavac
FluxBB 是一个快速、轻量级论坛软件,它的开发者是一名德国的 PHP 天才 Franz Liedke。FluxBB 的下一个版本(2.0)将被完全重写,并已经开发了一段时间。FluxBB 看起来非常有前途的,
java统计在线人数(session存储信息的)
macroli
javaWeb
这篇日志是我写的第三次了 前两次都发布失败!郁闷极了!
由于在web开发中常常用到这一部分所以在此记录一下,呵呵,就到备忘录了!
我对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。
1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。
public class Ses
bootstrp carousel初体验 快速构建图片播放
qiaolevip
每天进步一点点学习永无止境bootstrap纵观千象
img{
border: 1px solid white;
box-shadow: 2px 2px 12px #333;
_width: expression(this.width > 600 ? "600px" : this.width + "px");
_height: expression(this.width &
SparkSQL读取HBase数据,通过自定义外部数据源
superlxw1234
sparksparksqlsparksql读取hbasesparksql外部数据源
关键字:SparkSQL读取HBase、SparkSQL自定义外部数据源
前面文章介绍了SparSQL通过Hive操作HBase表。
SparkSQL从1.2开始支持自定义外部数据源(External DataSource),这样就可以通过API接口来实现自己的外部数据源。这里基于Spark1.4.0,简单介绍SparkSQL自定义外部数据源,访
Spring Boot 1.3.0.M1发布
wiselyman
spring boot
Spring Boot 1.3.0.M1于6.12日发布,现在可以从Spring milestone repository下载。这个版本是基于Spring Framework 4.2.0.RC1,并在Spring Boot 1.2之上提供了大量的新特性improvements and new features。主要包含以下:
1.提供一个新的sprin
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 | # | 引用
eva 说:
function f1(){
n=999;
}
alert(n); // error
这段代码在IE8和FIREFOX5上根本不能运行,求解释...
2011年9月 2日 10:03 | # | 引用
rush 说:
@eva
function f1(){
n=999;
}
alert(n); // error
很明显啊,全局变量n是在函数f1中定义的,你不调用函数f1,n怎么定义呢
function f1(){
n=999;
}
f1();
alert(n);
这样不就OK了
2011年9月 2日 11:27 | # | 引用
Kris Agnelli 说:
At this time enhancements in could also be noticed in a point of contention.
2011年9月 8日 11:20 | # | 引用
Leigh 说:
思考题中的例子貌似是 javascript高级程序设计里的。今天刚看到。
2011年9月28日 22:19 | # | 引用
hyant 说:
你真是个有趣的人,为什么我总能在你这里找到我感兴趣的博文?……
2011年10月11日 16:41 | # | 引用
Legend1988 说:
楼主可以解释一下思考题一吗?我看很多人跟我一样都不是很懂思考题一啊,万分感谢!
2011年10月28日 10:13 | # | 引用
huangyunbin 说:
同问,为什么this在嵌套函数中的意义不一样
2011年11月 2日 16:37 | # | 引用
apple 说:
this始终表示调用者的应用,第一个的闭包返回出来的一个函数,就是在window的环境下调用了这个函数,所以这个this是指向的window,而第二个把this保存在了that中。不知道说清楚没有
2011年11月14日 18:03 | # | 引用
Richard.Chou 说:
不错,小伙子讲的很到位,比一些书上生硬的翻译要好一些。Good!
2011年11月16日 10:39 | # | 引用
布田 说:
后面第1个例子怎么输出result, result 是什么意思
2011年11月25日 10:19 | # | 引用
noodles 说:
@陈锐达:
根据您的解释,运行结果是不对的!如在A中定义name,执行结果一样
2011年11月30日 23:24 | # | 引用
追逐我的梦 说:
实际上,我认为闭包只是给外部函数提供了一个操作局部变量的途径,局部变量本身并没有改变,仍然为局部变量。
2011年12月 5日 23:04 | # | 引用
艳阳天 说:
我也觉得最后两个例子,好像跟this的关系更大……
2011年12月 9日 15:15 | # | 引用
avatasia 说:
@tt 发问需谨慎, 文中的写法是一种类的写法, 域里有动作,你这个是函数。
2011年12月15日 10:45 | # | 引用
清流鱼 说:
渐渐地对闭包和this有点了解,尤其加上各位网友的激情讨论,并附上示例,通俗易懂!
2011年12月22日 23:09 | # | 引用
alex 说:
不行哦,一定要引用一次,不然还不是闭包。
2012年2月10日 16:08 | # | 引用
黄黄 说:
我赞成。。
2012年2月28日 13:32 | # | 引用
林子 说:
个人觉着楼主说的不是闭包
2012年3月12日 17:37 | # | 引用
daniel 说:
初学者就这么理解闭包,最好不过了。
2012年4月 6日 15:28 | # | 引用
甄超文 说:
思考题答案:The Window、My Object;其实最关键的就是要明白作用域链和闭包所起到的作用,其实闭包说到底就是一个函数,而且函数调用返回后其资源所占用的栈区并没有释放,,所以变量就还保存在内存中,由于作用域链的关系,它会去寻找离其最近的var声明,var声明所在就是该闭包所在的层,从而在这层里面所得到的结果就是它最后的值,于是乎返回值也就是这个最终的值了
2012年6月12日 14:13 | # | 引用
袁huhu 说:
最后两道思考题~ 其实和函数调用还有关系的~ 在以上例子中使用的是函数调用的方式,this这时候是指全局变量
2012年6月27日 10:51 | # | 引用
红雨 说:
正解,和闭包有什么关系啊
2012年7月10日 23:47 | # | 引用
小涛故事 说:
对于代码片段一
object.getnameFunc() 返回的匿名闭包函数被全局变量所引用,其中的this指向
全局变量,当执行时打印The Window 。
对于代码片段二
object.getnameFunc() 在返回闭包函数前,将this赋给that,此时getnameFunc是由
object调用的,故而this指向object,当内部函数被返回时,由于闭包的特性,仍然
能访问到外部函数中的值,当执行打印My Object 。
2012年7月20日 19:37 | # | 引用
徐相 说:
代码段一、
当一个函数作为函数而不是方法调用的时候,这个this关键字引用全局对象。容易令人混淆的是,当一个嵌套的函数(作为函数)在一个包含的函数中调用,而这个包含的函数是作为方法调用的,这也是成立的:this关键字在包含的函数中有一个值,但是它却(不太直观地)引用嵌套的函数体的内部的全局对象。
所以第一个打印出来的是"The Window"
代码段二、
由于this关键字不是在包含的函数中引用的,而是通过that=this这个调用的,所以这个this不是在闭包内的,因此这个this就不能调用函数体内的全局对象,而是他的局部对象object.name,所以第二个打印出来的是"My Object"
2012年8月 2日 10:33 | # | 引用
编程大师 说:
说多无用,关键是理清函数什么时候作为对象使用,什么时候作为函数使用。
2012年8月18日 00:46 | # | 引用
编程大师 说:
object.getnameFunc()() 也可以改为object.getnameFunc().call()
这就是javascript狡猾的地方。
2012年8月18日 00:49 | # | 引用
zernmal 说:
讲得很易懂 ··· 然后,最后思考题 感觉 是this关键字的问题,暂时还不懂··
2012年9月22日 20:11 | # | 引用
核桃博客 说:
谢谢,关于闭包本身的概念非常清晰, 不过我当初读你这篇文章的时候最大的困惑是为什么要搞出闭包这个东西来, 我这里写了我的理解
http://www.hetaoblog.com/myblogs/post/javascript-closure-chain-scope-anonymous-function-module.jhtml
2012年10月 6日 22:22 | # | 引用
哥的传说 说:
请问阮兄/各位高人,假如某个JavaScript的函数对象已被调用过一次,如何用代码验证/判断当该函数对象被第二次调用时,它是新创建的还是使用的内存中已有的?
2012年11月 3日 18:52 | # | 引用
hanvslin 说:
完全赞同这位仁兄的看法!!前面闭包讲的不错,但是最后面的思考题出的很烂啊,跟闭包没关系,让人看完了反而糊涂了!
2012年11月14日 14:21 | # | 引用
Degas 说:
有个特别大的疑问:
……原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,……
f2真的被赋给一个全局变量了?
2012年12月10日 16:15 | # | 引用
rst 说:
最初我也以为思考题与文章主题无关,这两天在反复看 JavaScript 权威指南 函数一章,都看晕了...
产生闭包效果的环境必须是嵌套函数的引用被保存到了一个全局作用域里面,也不难理解 阮老师思考题的设计了
2012年12月25日 17:21 | # | 引用
jsnew 说:
在退出函数之前,将不使用的局部变量全部删除。
请教一下这个改如何做?不太明白。。。Thanks!
2013年1月14日 13:35 | # | 引用
初学JS 说:
保留内存值的解释有点不好,即使var result = f1(); 即使这里不赋值给全局变量result,通过f1()();也不会改变n的值,呵呵~
2013年2月20日 17:29 | # | 引用
xiaoxiehang 说:
后面的思考题 阮哥能解释一下吗
前面的例子是看懂了 但是思考题还是不会做
2013年2月20日 17:59 | # | 引用
wengee 说:
这里对于闭包的讲解好一点:普通的函数内嵌,内部函数是先执行;而闭包则是:先把内部函数赋给外部函数,然后在执行。
2013年2月23日 12:11 | # | 引用
西毒 说:
跟阮老师学JS!
2013年2月27日 13:08 | # | 引用
macrotea 说:
感觉应该从js作用域链及其原理来分析闭包,这样才能彻头彻尾明白!
2013年3月 2日 12:20 | # | 引用
zhangyq 说:
2013年3月 6日 10:51 | # | 引用
douya0808 说:
每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量(这一点通过前面的图可以看得更清楚)。意思就是说找到匿名函数中的this和arguments就不会再往下找了(这里的往下指的是外层的包含函数,和最外层的window全局环境),而匿名函数的this对象通常指向window,所以输出的是全局的那个字符串。不过,把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了
2013年4月 9日 19:57 | # | 引用
Fenix 说:
不执行调用f1肯定不可能生成test变量,第二个问题同样的原因。
浅显易懂,很好。
如下看法,认为有待商榷:
#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
2013年4月30日 18:50 | # | 引用
Black 说:
哦。看了你这个解释就了解了
2013年5月28日 15:38 | # | 引用
curran 说:
说的很易懂,最后两个例子还是有点模糊
2013年5月30日 11:37 | # | 引用
C的边缘 说:
为什么话要反着说呢,应该说正例,这着用太糟糕了,赞同 @迷途小书童 @steven
2013年6月 8日 15:11 | # | 引用
范小龙 说:
2013年6月18日 15:50 | # | 引用
phplaber 说:
“闭包的概念”这一节总结的非常好,浅显易懂。同时,也了解了闭包的两个用处:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
2013年6月27日 20:59 | # | 引用
zz 说:
最后两个例子关键是区分object.getnameFunc()调用时和调用后的this指向。
第一个问题,object.getnameFunc()()函数在执行时this属于全局域,因此结果是the window
第二个问题,通过使用that=this 保留了在调用object.getnameFunc()时的this状态值。因此在getnameFunc()的闭包中访问的变量是已经不是this的了,而是that的~
2013年7月25日 21:06 | # | 引用
陈默 说:
JS新手,学习了,思考题和讨论很强大。
2013年7月30日 14:34 | # | 引用
张雨阁 说:
思考题解答(个人见解):
1、因为闭包最后的返回值是一个函数,注意紧紧是一个函数而已 并没有执行,等到alert调用时才执行,而这时执行调用的方法,前面阮老师说了,函数内没有var声明的事全局变量,所以调用的getName是一个全局的变量,所以对应this找到的是全局的name.
2、因为this的对象引用在编译时就已经确定了,就是object,所以返回值在Object中开始查找,找到了Obeject中的name就不到全局变量中查找。
2013年8月19日 11:23 | # | 引用
abel533 说:
综合各种理解之后,我明白最后的“代码片段一”中的闭包函数中的this是window对象,也就是说..闭包函数的范围竟然是window。。。
2013年8月22日 16:43 | # | 引用
superx 说:
这么理解还不如不理解,这样下来对新手是一种误导。所以说才建议大家尽量都去看英文网站。唉
2013年9月24日 09:37 | # | 引用
wei 说:
其实看完这篇文章,对于闭包的概念就有了更深刻的理解
最后留的两道题目,很好的说明了这一点。
因为第一题中getNameFunc这个方法或者叫函数是属于全局作用域的,所以里面返回的this始终都是指向window的。而第二题中用that=this改变了当前函数指向的作用域,所以第二题中的this最终只想的是myobject。
不知道我的理解正确不正确。
如果说错,请勿见怪...
2013年10月 9日 23:37 | # | 引用
nebula 说:
return function() {
return this.name;
}
这里的this代表调用方法时所在的的作用域:全局作用域window。
return function() {
return that.name;
}
object.getNameFunc()()此处实现了从外部调用局部变量的方法,that会顺着作用域链向上级作用域查找,所以获得是getnameFunc的定义的变量var that = this。
2013年11月13日 15:23 | # | 引用
汉锐 说:
@小彘:
是引用类型。f3和f4的值是指针,只想obj()。所以全等是true。
2013年11月13日 18:47 | # | 引用
silenceper 说:
后两个应该this的作用域问题,不是闭包的问题吧。 弄的我都糊涂了... 还好找了一篇通俗的问题在,终于弄懂了
2013年12月 3日 10:31 | # | 引用
小小技术员 说:
执行过f1这个函数后,test如果是局部变量会被销毁,如果是全局变量则会保存在内存堆(heap)里,如果不执行f1函数,test和nadd都是不存在的
2013年12月 5日 13:53 | # | 引用
小小技术员 说:
不,我补充一下,我应该是说错了,既然f2函数是闭包,那么f2函数会保持它的外部函数f1的作用域,即使定义test为f1函数的局部变量(var test = 10);那么也要先检查f2是否对test产生引用,如果引用数为0,则在f1()调用完后销毁,再运行f1()()(实际上是调用f2函数)也不会产生对test这个局部变量的引用,所以它就在栈中被销毁了。
如果理解的不对,请大侠们拍砖
2013年12月 5日 14:19 | # | 引用
_____LG 说:
最后的思考题如果能理解这句话“this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的”,我想就能它们的运行结果了
2014年1月 6日 16:29 | # | 引用
紧张的小白 说:
this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的。喜欢这句话,但是闭包还是没有理解透彻。
2014年1月14日 15:14 | # | 引用
陈守川 说:
我觉得大家说了这么多,都没人把代码写出来运行一下来验证自己的答案么,也不管自己的答案是否正确么。通过运行发现:
思考题一:打印:空白
思考题二:打印:My Object
虽然我不太了解,但是评论中的很多人自己也理解错误了。
2014年2月17日 11:56 | # | 引用
jprovim 说:
R兄講的非常簡單易懂。
2014年2月22日 06:25 | # | 引用
bryantzhang 说:
我觉得是这样的,
第一个里边的this指向的是那个闭包函数,
第二个例子里边的this指向的是object。
2014年2月25日 10:59 | # | 引用
陈辉 说:
第一个 打印结果为 The window
第二个 打印结果为 My Object
第一个 this为全局对象,所以alert处理的name为The window
第二个 that 为object对象,所以alert 处理的name为My object
第二个好理解,因为在调用前用that 保存了object 自己的this,所以that 就成为是有变量,在闭包内可以调用。
第一个有点晕,因为第一个的this指向自己,然后被window 给调用this 就成了window对象,它的name就是全局的name
我觉得大家说了这么多,都没人把代码写出来运行一下来验证自己的答案么,也不管自己的答案是否正确么。通过运行发现:
思考题一:打印:空白
思考题二:打印:My Object
虽然我不太了解,但是评论中的很多人自己也理解错误了。
2014年3月16日 15:49 | # | 引用
忍不住要问了 说:
这篇文章流传很广,看了多次,忍不住要问了。下面这句话:
---------
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
-----------
请问有哪种语言是“不”可以在函数内部直接读取全局变量的? 全局变量什么意思,就是在任何地方都可以读取。
2014年3月29日 23:27 | # | 引用
Ming 说:
我觉得这句话可以改成:
Javascript语言的特殊之处,就在于函数内部可以直接声明(不使用var)并读取全局变量。
2014年4月23日 01:44 | # | 引用
Asakura 说:
同感啊,一直对此很费解
2014年5月11日 15:34 | # | 引用
yuanboss 说:
感觉基本是参考《javascript高级程序设计》这本书里面的
2014年5月15日 22:12 | # | 引用
阮一峰 说:
本文关闭,不再接受回复。
2014年5月27日 20:42 | # | 引用