Javascript的闭包

闭包对于很多学编程语言的程序员来说是个陌生的概念,令人望而生畏。其实理解闭包是非常简单的,只需要学会三个基本的事实。第一:JavaScript允许你引用在当前函数以外定义的变量。

function makeSandwich(){
	var magicIngredient = "peanut butter";
	function make(filling){
		return magicIngredient + "and" +filling;
	}
	return make("jelly");
}
makeSandwich();  //"peanut butter and jelly"
注意内部的make函数是如何引用定义在外部makeSandwich函数内的magicIngredient 变量的。

第二:即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量。

function sandwichMaker(){
	var magicIngredient = "peanut butter";
	function make(filling){
		return magicIngredient +"and" +"filling";
	}
	return make;
}
var f = sandwichMaker();
f("jelly"); //"peanut butter and jelly"
f("bananas");//"peanut butter and bananas"
f("marshmallows");//"peanut butter and marshmallows"

这与第一个例子不同的是,不是外部的sandwichMaker 函数中立即调用make("jelly"),而是返回make函数本身。因此f的值为内部的make函数,调用f实际上是调用函数make函数。但即使sanwichMaker函数已经返回,make函数仍能记住magicIngredient的值。

Javascript的函数值包含了比调用它们时执行所需要的代码还要多的信息。而且,Javascript函数值还在内部存储它们可能会引用的定义在其封闭作用域的变量。那些在其所涵盖的作用域内跟踪变量的函数被称为闭包。make函数就是一个闭包,其代码引用了两个 外部变量:magicIngredient和filling。每当make函数被调用时,其代码都能引用到这两个变量,因为该闭包存储了这两个变量。

JavaScript还提供了一种更为方便地构建闭包的字面量语法--函数表达式。

function sandwichMaker(magicIngredient){
	return function(filling){
		return magicIngredient+"and" +filling;
	}
}
第三:闭包可以更新外部变量的值。实际上,闭包存储的是外部变量的引用,而不是它们的值的副本。因此,对于任何具有访问这些外部变量的闭包,都可以进行更新。一个简单的惯用法box说明了这一切。它存储了一个可读写的内部值。

function box(){
	var val =undefined;
	return {
	  set:function(newVal){val = newVal;},
	  get:function(){return val;},
	  type:function(){return typeof val;}
	};
}
var b = box();
b.type();//"undefined"
b.set(98.6);
b.get();//98.6
b.type();//"number"
该例子产生了一个包含三个闭包的对象。这三个闭包是set、get和type属性。它们都共享访问val变量。set闭包更新val的值,随后调用get和type查看更新的结果。
总结:

函数可以引用定义在其外部作用域的变量。

闭包比创建它们的函数有更长的生命周期。

闭包在内部存储其外部变量的引用,并能读写这些变量。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值