闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和 Python,objective c 等语言中都能找到对闭包不同程度的支持。
闭包的价值在于可以作为函数对象 或者匿名函数,对于类型系统而言这就意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中、作为参数传递给其他函数,最重要的是能够被函数动态地创建和返回。
举个简单的例子:
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c(); //1
c(); //2
这段代码有两个特点:
(1)函数b嵌套在函数a内部;
(2)函数a返回函数b。
这样在执行完var c = a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。
这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
匿名函数的例子:
jquery中我们经常用到这样的代码:
$("#id").click(
function(){
//do somethine
});
其中的function就是匿名函数。
匿名函数和闭包常常结合使用,是代码变得很灵活。
看一个插件的简单例子:
plugins=function(name){
var _name=name||'jack';
return {
nameWithAge:function(age){ alert(_name+"'s age is "+age); },
nameWithSex:function(sex){alert( _name+"'s sex is "+sex);}
};
}
ok,现在我要使用它了,
var myplugin=plugins('rose');
myplugin.nameWithAge(21);
输出结果:rose's age is 21
myplugin.nameWithSex('girl');
输出结果:rose's sex is girl
假如我现在有个新需求增加一个【爱好】的插件;那么你可以很灵活的扩充:
plugins=function(name){
var _name=name||'jack';
return {
nameWithAge:function(age){ alert(_name+"'s age is "+age); },
nameWithSex:function(sex){alert( _name+"'s sex is "+sex);},
nameWithHobby:function(hobby){alert(_name+"'s hobby is "+hobby);}
};
}
修改后调用插件:
myplugin.nameWithHobby('swiming');
输出结果:rose's hobby is swiming
可以看到闭包和匿名函数的结合体现了一定的灵活性。
以上只是自己的一点微不足道的经验,如果有什么不对的地方,欢迎大牛前来拍砖。
相关推荐
主要介绍了JavaScript匿名函数和闭包的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
匿名函数,也称为拉姆达函数,是一种使用JavaScript...JavaScript中的匿名函数和闭包都是非常有用的特性,利用它们可以实现很多功能。不过,因为创建闭包必须维护额外的作用域,所以过度使用它们可能会占用大量内存。
主要介绍了JavaScript 匿名函数和闭包介绍,需要的朋友可以参考下
javascript笔记之匿名函数和闭包.docx
本文介绍了js匿名函数和闭包的相关内容,供大家参考,具体内容如下 匿名函数 [removed] //function(){}//会报错 var fun = function(){};//将匿名函数赋值给变量 (function(){})();//匿名函数自执行 function...
本文详细介绍了匿名函数、闭包、并给出了详细的例子以及详细的注意事项,是篇非常非常不错的文章,推荐给大家。
(转载)JavaScript中匿名函数,函数直接量和闭包.docx
闭包是用匿名函数来实现。闭包就是一个受到保护的变量空间,由内嵌函数生成。“保护变量”的思想在几乎所有的编程语言中都能看到。 先看下 JavaScript 作用域: JavaScript 具有函数级的作用域。这意味着,不能在...
NULL 博文链接:https://xieyaxiong.iteye.com/blog/1558277
(转载)JavaScript中匿名函数,函数直接量和闭包
函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 function double(x){ return 2 * x; } 第二...
本文通过示例给大家介绍javascript的闭包,原型,和匿名函数,具体详情请看下文。 一 .>关于闭包 理解闭包 需要的知识 1.变量的作用域 例1: var n =99; //建立函数外的全局变量 function readA(){ alert(n)...
主要介绍了JavaScript闭包函数访问外部变量的方法,本文使用匿名函数来实现在闭包中访问外部变量,需要的朋友可以参考下
本篇主要介绍普通函数、匿名函数、闭包函数 目录 普通函数:介绍普通函数的特性:同名覆盖、arguments对象、默认返回值等。 匿名函数:介绍匿名函数的特性:变量匿名函数、无名称匿名函数。 闭包函数:介绍闭包...
匿名函数:没有实际名字的函数。 匿名函数的作用: 1、通过匿名函数可以实现闭包,关于闭包在后面的文章...本章节重点给大家介绍JavaScript 中的匿名函数((function() {})();)与变量的作用域,具体内容如下所示: 以前