闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在 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中的匿名函数和闭包是强大的工具,它们可以帮助我们创建私有变量、实现模块化和数据封装,以及在异步编程中起到重要作用。理解并熟练运用这些概念对于任何JavaScript开发者来说都是至关重要的。
JavaScript中的匿名函数和闭包是两个非常重要的概念,它们在函数式编程和模块化开发中起着关键作用。 首先,让我们来理解匿名函数。匿名函数,顾名思义,是没有名称的函数。在JavaScript中,我们可以直接定义一个不...
总的来说,JavaScript的匿名函数和闭包是实现模块化、封装和高效代码的关键工具。它们可以帮助开发者创建更加健壮和易于管理的代码,同时减少全局变量的使用,提升代码的执行效率和安全性。理解并熟练运用这些概念...
在JavaScript中,匿名函数、函数直接量和闭包是三种非常重要的概念,它们在编程实践中有着广泛的应用。让我们逐一深入探讨这些概念。 1. **匿名函数**: 匿名函数是指没有名字的函数,通常作为表达式的一部分存在...
JavaScript中的闭包、匿名函数和作用域链是编程中至关重要的概念,它们是理解JavaScript运行机制的关键。在本文中,我们将深入探讨这三个概念,并通过实际示例来展示它们的运用。 首先,我们来讨论“闭包”。闭包是...
更复杂的是,可以使用`new Function`构造函数创建函数,或者定义匿名函数,如`(function(){ //TODO here})()`,这常用于模块化隔离。内嵌函数(内部函数)允许访问外部函数的变量,这是闭包的基础。 当我们谈论函数...
总结一下,JavaScript的匿名函数是其动态特性和灵活性的重要组成部分。它们可以用于立即执行、作为参数传递、作为返回值,以及创建闭包。理解并熟练运用匿名函数是提升JavaScript编程技能的关键。通过深入研究这些...
- 函数式编程:匿名函数是JavaScript函数式编程的核心,例如高阶函数、闭包、柯里化等概念都离不开匿名函数。 5. 匿名函数的优缺点: - 优点:提高代码的封装性,减少全局变量,提高代码的安全性和可维护性,适用...
}}`中,`makeFunc`返回的匿名函数创建了一个闭包,它记得变量`x`的值,并能在每次调用时增加这个值。 在JavaScript中,闭包经常用于创建私有变量和方法,这在模块化编程中非常有用。闭包还能保持变量的状态,使得...
闭包是用匿名函数来实现。闭包就是一个受到保护的变量空间,由内嵌函数生成。“保护变量”的思想在几乎所有的编程语言中都能看到。 先看下 JavaScript 作用域: JavaScript 具有函数级的作用域。这意味着,不能在...