在JavaScript中,闭包指的是有权访问另一个函数作用域中的变量的函数;创建闭包最常见的方式就是在一个函数内创建另一个函数。如下例子:

function A(propertyName){
return function(object1, object2){
var v1 = object1[propertyName];
var v2 = object2[propertyName];
...
}
}

  

上面的例子中返回了一个内部函数(一个匿名函数),第3、4行代码之所以能访问外部函数中的变量propertyName,是因为内部函数作用域链中包含A()的作用域。

理解函数的第一次被调用:当某个函数第一次被调用时,会创建一个作用域链(其实在函数创建时就存在)及一个执行环境,并把作用域链值赋给内部属性[[Scope]],再使用this、arguments和其他命名参数的值来初始化函数的活动对象。在作用域链中,外部函数的活动对象始终处于第二位,......直至全局执行环境。如下例子:

function sum(v1, v2){
if(...){
return -1;
}else if(...){
return 1;
}else{
return 0;
}
}
var result = sum(1, 2);

  

上面的例子中,定义了sum()函数,再在全局作用域中调用它,第一次调用sum()时,会创建一个包含this、arguments、v1、v2的活动对象,全局执行环境的变量对象(this、result、sum)在sum()执行环境的作用域链中处于第二位。

这里要注意的是,当函数执行完后,其活动对象也还没被销毁,如在第一个例子A()中,因为匿名函数的作用域链仍然引用着活动对象,直到匿名函数被销毁,A()的活动对象才会被销毁。如:

var a = A('name');  // 创建函数
// ...调用函数
a = null; // 解除对匿名函数的引用,释放内存

  

通过将a设为等于null,解除了该函数的引用,垃圾回收例程会将其回收,匿名函数的作用域链也将被销毁。

关于this:

看下面例子:

var name = "aa";

var obj = {
name : "bb",
getName : function(){
return function(){
return this.name;
};
}
}; alert(obj.getName()()); // "aa"

  这里返回的name值是全局作用域下的,匿名函数并没有取得其外部作用域的this对象。因为每个函数在被调用时,其活动对象都全自动取得两个特殊变量:this和arguments,内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此在这个例子中不会访问到外部函数的这两个变量。如果将外部作用域中的this对象保存在一个闭包能访问到的变量里,就可以让闭包访问到该对象。如下:

var name = "aa";

var obj = {
name : "bb",
getName : function(){
var that = this;
return function(){
return that.name;
};
}
}; alert(obj.getName()()); // "bb"

  

 

if ("你对我感兴趣") {

return  "点击到简书找我玩";

}

else{ 

 return "带着受伤的心谢谢您~";

}

【JS】JavaScript中的闭包的更多相关文章

  1. JavaScript中的闭包理解

    原创文章,转载请注明:JavaScript中的闭包理解  By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...

  2. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  3. 难道这就是JavaScript中的"闭包"

    其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...

  4. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  5. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

  6. Javascript中的闭包(转载)

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  7. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  8. [译]Javascript中的闭包(closures)

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  9. javaScript中的闭包原理 (译)

    这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...

随机推荐

  1. MapReduce深度分析(一)

    MapReduce深度分析(一) 一.数据流向分析 图为MapReduce数据流向示意图 步骤1.输入文件从HDFS流向到Mapper节点.在一般情况下,存储数据的节点就是Mapper运行的节点,不需 ...

  2. 数字操作 转为false的类型 typeof操作符 isNaN函数

    console.group('数字操作'); // 浮点数值的内存空间是整数的两倍: // 会alert出来3e-7;从小数点后面6个0开始,就用科学计数法了: //alert(0.0000003); ...

  3. FineUI表格模板列Undefined问题

    一般是配置文件未添加ClientID="AutoID"引起

  4. ubuntu-16.04(linux)使用Reaver爆破wifi密码(路由器的WPS功能漏洞)

    路由器的WPS功能 很多路由器都有WPS功能, 这边的WPS不是office工具软件, 而是路由器的一个功能: 路由器中WPS是由Wi-Fi联盟所推出的全新Wi-Fi安全防护设定(Wi-Fi Prot ...

  5. JavaScript 语法

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  6. Java如何判断字符串中包含有全角,半角符号

    首先介绍下全角跟半角之间的区别: 在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角" ...

  7. linux驱动的多种init函数及其调用顺序

    在驱动设计时可以选用多种驱动初始化函数达到控制驱动初始化顺序控制,其中level(__define_initcall的第一个参数即优先级)越小优先级越高, #define pure_initcall( ...

  8. <C++Primer>第四版 阅读笔记 第二部分 “容器和算法”

    泛型算法中,所谓"泛型(generic)"指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素. 第九章 顺序容器 顺序容器的元素排列次序与元 ...

  9. TPS及计算方法

    个事务,TPS为6 / 60s = 0.10 TPS.同时我们会知道事务的响应时间(或节拍),以此例,60秒完成6个事务也同时代表每个事务的响应时间或节拍为10秒.   利特尔法则  (Little' ...

  10. hadoop系列二:HDFS文件系统的命令及JAVA客户端API

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...