闭包

function createComparisonFunction(propertyName) {
return function (object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName]; if (value1 < value2) {
return -;
} else if (value1 > value2) {
return ;
} else {
return ;
}
};
}
//创建函数
var compare = createComparisonFunction("name");
//调用函数
var result = compare({ name: "Jim" }, { name: "Jack" });
//解除对匿名函数的引用,以便释放内存
compare = null;

匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。

这样,匿名函数可以访问在createComparisonFunction()中定义的所有变量,同时,createComparisonFunction()函数执行完毕后,其活动对象也不会被销毁,因为匿名对象的作用域链仍然引用这个活动对象。

直到匿名函数呗销毁后,createComparisonFunction()函数的活动对象才会被销毁

闭包与变量

下面代码片段中,片段1中,每个函数的作用域中都保存着createFunctions()函数的活动对象,所以他们都应用的是同一个变量i。createFunctions()函数执行完后,i为5,所以每个匿名函数内部i的值都是5

片段2中,在返回的匿名函数外部,再创建一个匿名函数,并将立即执行该匿名函数的结果赋给数组。函数参数按值传递,变量i的当前值赋值给num,匿名函数内部,创建了访问该num变量的闭包。

//代码片段1
function createFunctions() {
var result = new Array();
for (var i = ; i < ; i++) {
result[i] = function () {
alert(i);
}
}
return result;
} var funcs = createFunctions();
//Array.forEach()
funcs.forEach(function (item) { item(); }); //5,5,5,5,5 //代码片段2
function createFunctions() {
var result = new Array();
for (var i = ; i < ; i++) {
result[i] = function (num) {
return function () {
alert(num);
}
} (i);
}
return result;
} var funcs = createFunctions();
//Array.forEach()
funcs.forEach(function (item) { item(); }); //0,1,2,3,4

闭包中的this

var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
}
}
}; alert(object.getNameFunc()()); //"The Window"

object.getNameFunc()返回一个匿名函数,在全局环境调用该函数,this指向的全局对象

解决这一问题,可以将匿名函数外部作用域中this对象保存在闭包能够访问到的变量中

var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
var that = this;
return function () {
return that.name;
}
}
}; alert(object.getNameFunc()()); //"My Object"

最新文章

  1. haproxy 实现多域名证书https
  2. nexus
  3. Ninject之旅之二:开始使用Ninject(附程序下载)
  4. 阿里云日志api创建logStore
  5. sql中with as的用法练习
  6. Xubuntu 安装mentohust
  7. Mysql 列转行group_concat函数,与行转列
  8. Reverse Words in a String (JAVA)
  9. iOS绘制view
  10. 微信5.0 Android版飞机大战破解无敌模式手记
  11. 两个HTML,CSS布局实例
  12. python五种调试或排错的方法
  13. Vue.js 学习笔记 第3章 计算属性
  14. C++中几个输入函数的用法和区别(cin、cin.get()、cin.getline()、getline()、gets()、getchar())
  15. HBuilder --- MUI , HTML5
  16. Myeclipse 启动报错 Failed to create the java Virtual Machine
  17. 一个开启多个事务导致OptimisticLockException异常的问题
  18. Masonry基本语法
  19. 工欲善其事必先利其器,用Emmet提高HTML编写速度
  20. Spark1.3.1 On Yarn的集群搭建

热门文章

  1. flexbox语法(摘抄)
  2. dsplib使用备忘
  3. dumpbin
  4. 14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
  5. MySQL 更新走全表和索引的评估记录数
  6. 降低http请求次数
  7. 60s 经济学探奇
  8. [Android学习笔记]Android调试
  9. java中Hashtable中的t为什么是小写(转)
  10. winform下载网页代码