1:闭包
闭包的定义 :是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
/**
*闭包 :是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
*
* 这两行代码访问了外部函数中的变量propertyName.即使这个内部函数被返回了,而且是在其他地方被调用了,
* 但它仍然可以访问变量propertyName.之所以还能够访问这个变量,是因为内部函数的作用域包含
* createComparisonFunction()的作用域。
*
* 当某个函数第一次被调用时,会创建一个执行环境(execution context)及相应的作用域链,并把作用域链赋值
* 给一个特殊的内部属性(即[Scope])。然后,使后,使用this、arguments和其他命名参数的值来初始化函数的
* 活动对象(activation object)。但在作用域,外部函数的活动对象始终处于第二位,外部函数的外部函数的
* 活动对象处于第三位,..直至作用域链终点的全局执行环境。
*
*
* 由于闭包会携带包含它的函数的作用域,因此会比其他函数占有用更多的内存。过度使用闭包可能会导致内存占用
* 过多,所以只在绝对必要时考虑使用闭包。
*/
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1=object1[propertyName]; //****
var value2=object2[propertyName]; //****
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
}
}
2:闭包与变量
作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值 。因为闭包所保存的是整个变量对象、环境,而不是某个特殊的变量
/**
* 闭包与变量
*
* 作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值 。
* 因为闭包所保存的是整个变量对象、环境,而不是某个特殊的变量。
*/
function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(){
return i;
}
}
return result;
}
var funcs=createFunctions();
//每个函数都输出10
for(var i=0;i<funcs.length;i++){
document.write(funcs[i]()+"<br/>");
}
/**
*但是可以创建另一个匿名函数强制让闭包的行为条例预期行为。
*/
function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(num){
return function(){
return num;
}
}(i);
}
}
3:匿名函数(模仿块级作用域)
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。一般来说,我们都应该以是少向全局作用域中添加变量和函数。在一个由很多开发人员共同参与的大型应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员既可以使用自己的变量,又不必担心搞乱全局作用域。
/**
*模仿块级作用域
*
* 这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
* 一般来说,我们都应该以是少向全局作用域中添加变量和函数。在一个由很多开发人员共同参与
* 的大型应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个
* 开发人员既可以使用自己的变量,又不必担心搞乱全局作用域。
*/
(function(){
//这里是块级作用域
})()
//无论什么地方,只要临时需要一些变量,就可以使用私有作用域。
function outputNumbers(count){
(function(){
for(var i=0;i<count;i++){
alert(i);
}
})()
alert(i); //导致一个错误。
}
/**
*这段代码在全局作用域中,其中变量now现在是匿名函数中的局部变量,而我们不必在全局作用域中创建它。
* 这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用,只要函数执行完毕,就可以立即
* 销毁其作用域了。
*/
(function(){
var now=new Date();
if(now.getMonth()==0 && now.getDate()==1){
alert("Happy new year!");
}
})
4:模块模式
道格拉斯所说的模块模式(module pattern)是为单例创建私有变量和特权方法。 这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时非常有用。
/**
*模块模式
* 道格拉斯所说的模块模式(module pattern)是为单例创建私有变量和特权方法。
* 这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时非常有用。
*/
var singleton=function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//特权、公有方法和属性
return {
publicProperty:true,
publicMethod:function(){
privateVariable++;
return privateFunction();
}
}
}
/**
*增强的模块模式
* 这种增强的模块模式适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其以增强的情况。
*/
var singleton=function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//创建对象
var object=new CustomType();
//添加特权/公有属性和方法
object.publicProperty=true;
object.publicMethod=function(){
privateVariable++;
return privateFunction();
};
//返回这个对象
return object;
}
分享到:
相关推荐
接着讨论了 JavaScript 中的全局作用域、局部作用域、块级作用域和函数作用域,特别是闭包的概念。随后,文章探讨了函数的高级用法,如递归函数、高阶函数和立即执行函数表达式(IIFE)。最后,通过实际应用示例,如...
- **作用域链**:当一个函数被创建时,它会捕获一个**作用域链**,这个链包含了函数内部的作用域、包含该函数的作用域以及全局作用域。 - **内存保留**:如果一个函数返回了一个闭包,那么该函数的作用域(包括所有...
在讨论JavaScript编程语言时,匿名函数和闭包是两个重要的概念,它们在函数式编程和模块化代码设计中扮演着核心角色。匿名函数是没有具体名称的函数,它们可以是独立的,也可以是表达式的一部分,通常用于定义临时...
`)仅在该函数作用域内可见,而外部变量(如`out_var`)则可以通过作用域链在内部访问。闭包是理解作用域链的关键概念,它允许内部函数记住其定义时的作用域,即使外部函数已经完成执行。闭包常常用于封装变量和实现...
总结来说,JS第16章“匿名函数和闭包”是理解JavaScript中函数作用域和内存管理的关键章节。这部分知识对于编写高效、可维护的JavaScript代码至关重要。掌握这些概念可以帮助开发者写出更加模块化、功能更强大的程序...
在JavaScript中,变量的作用域分为全局作用域和函数作用域,但没有块级作用域。这意味着在`for`循环或其他块语句(如`if`、`else`)中定义的变量实际上是在包含它们的函数作用域内创建的,而不是仅限于那个块。这...
在JavaScript中,匿名函数、函数直接量和闭包是三种非常重要的概念,它们在编程实践中有着广泛的应用。让我们逐一深入探讨这些概念。 1. **匿名函数**: 匿名函数是指没有名字的函数,通常作为表达式的一部分存在...
在这个例子中,`outer`函数返回了一个匿名函数,该匿名函数形成了一个闭包,可以访问并修改`outer`函数作用域内的`counter`变量。 在jQuery中,经常可以看到匿名函数的使用,尤其是在初始化代码或插件中,通过IIFE...
JavaScript闭包是编程中的一个重要概念,它涉及到函数的内部作用域和对外部变量的访问。简单来说,闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的变量,即使在其外部函数已经执行完毕后。闭包在...
### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** 在JavaScript中,函数是一段可重用的代码块,用来执行特定任务。函数可以通过两种方式进行定义:函数声明和函数表达式。 - **函数...
总的来说,JavaScript中的匿名函数和闭包是强大的工具,它们可以帮助我们创建私有变量、实现模块化和数据封装,以及在异步编程中起到重要作用。理解并熟练运用这些概念对于任何JavaScript开发者来说都是至关重要的。
局部作用域又可以细分为函数作用域和块级作用域。闭包是函数和声明该函数的词法环境的组合,即使外部函数已经返回,闭包依然可以访问外部函数的变量。 闭包函数访问外部变量的方法通常有两种:直接引用和通过匿名...
这里,`box`函数返回了一个匿名函数,这个匿名函数可以访问`box`函数作用域内的`user`变量。 ### 闭包的优缺点 **优点:** 1. 可以避免使用全局变量,减少全局命名空间的污染。 2. 可以保护函数内的变量不被外界...
这个过程可以用一个可视化的方式表示,如同图解所示,从下到上依次是全局作用域、匿名函数作用域和`sub`函数作用域。如果在`sub`函数内部尝试访问一个变量,JavaScript会沿着作用域链向上搜索,直到找到该变量或者...
### JavaScript闭包详解 #### 一、闭包概念与工作机制 **闭包**是JavaScript中最强大的特性之一,它使得函数能够记住并访问其定义时所在的作用域中的变量。要理解和运用闭包,首先需要理解作用域、作用域链以及...
JavaScript中的匿名函数和闭包是两个非常重要的概念,它们在函数式编程和模块化开发中起着关键作用。 首先,让我们来理解匿名函数。匿名函数,顾名思义,是没有名称的函数。在JavaScript中,我们可以直接定义一个不...
首先,闭包是由于JavaScript的函数作用域机制产生的。在JavaScript中,每个函数都有自己的作用域,内部函数可以访问外部函数的变量,但外部函数不能直接访问内部函数的变量。当内部函数被返回或作为返回值时,它依然...
- 模块化:通过匿名函数,配合var关键字,可以创建私有作用域,避免全局变量污染,如YUI和其他JavaScript库中广泛使用。 - 防止命名冲突:在多个脚本共存的页面中,匿名函数可以降低变量命名冲突的风险。 - 函数...