`
xieyaxiong
  • 浏览: 41471 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

javascript 闭包、匿名函数、作用域链

阅读更多

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: 函数与作用域深入解析及应用场景

    接着讨论了 JavaScript 中的全局作用域、局部作用域、块级作用域和函数作用域,特别是闭包的概念。随后,文章探讨了函数的高级用法,如递归函数、高阶函数和立即执行函数表达式(IIFE)。最后,通过实际应用示例,如...

    JS匿名函数、闭包

    - **作用域链**:当一个函数被创建时,它会捕获一个**作用域链**,这个链包含了函数内部的作用域、包含该函数的作用域以及全局作用域。 - **内存保留**:如果一个函数返回了一个闭包,那么该函数的作用域(包括所有...

    JavaScript 匿名函数和闭包介绍

    在讨论JavaScript编程语言时,匿名函数和闭包是两个重要的概念,它们在函数式编程和模块化代码设计中扮演着核心角色。匿名函数是没有具体名称的函数,它们可以是独立的,也可以是表达式的一部分,通常用于定义临时...

    深度探讨javascript函数的原型链和闭包

    `)仅在该函数作用域内可见,而外部变量(如`out_var`)则可以通过作用域链在内部访问。闭包是理解作用域链的关键概念,它允许内部函数记住其定义时的作用域,即使外部函数已经完成执行。闭包常常用于封装变量和实现...

    JS 第16章 匿名函数和闭包

    总结来说,JS第16章“匿名函数和闭包”是理解JavaScript中函数作用域和内存管理的关键章节。这部分知识对于编写高效、可维护的JavaScript代码至关重要。掌握这些概念可以帮助开发者写出更加模块化、功能更强大的程序...

    JavaScript使用闭包模仿块级作用域操作示例

    在JavaScript中,变量的作用域分为全局作用域和函数作用域,但没有块级作用域。这意味着在`for`循环或其他块语句(如`if`、`else`)中定义的变量实际上是在包含它们的函数作用域内创建的,而不是仅限于那个块。这...

    (转载)JavaScript中匿名函数,函数直接量和闭包.docx

    在JavaScript中,匿名函数、函数直接量和闭包是三种非常重要的概念,它们在编程实践中有着广泛的应用。让我们逐一深入探讨这些概念。 1. **匿名函数**: 匿名函数是指没有名字的函数,通常作为表达式的一部分存在...

    深入研究JavaScript的匿名函数.doc

    在这个例子中,`outer`函数返回了一个匿名函数,该匿名函数形成了一个闭包,可以访问并修改`outer`函数作用域内的`counter`变量。 在jQuery中,经常可以看到匿名函数的使用,尤其是在初始化代码或插件中,通过IIFE...

    JavaScript闭包与作用域链实例分析

    JavaScript闭包是编程中的一个重要概念,它涉及到函数的内部作用域和对外部变量的访问。简单来说,闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的变量,即使在其外部函数已经执行完毕后。闭包在...

    JavaScript:函数与作用域

    ### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** 在JavaScript中,函数是一段可重用的代码块,用来执行特定任务。函数可以通过两种方式进行定义:函数声明和函数表达式。 - **函数...

    javascript笔记之匿名函数和闭包.docx

    总的来说,JavaScript中的匿名函数和闭包是强大的工具,它们可以帮助我们创建私有变量、实现模块化和数据封装,以及在异步编程中起到重要作用。理解并熟练运用这些概念对于任何JavaScript开发者来说都是至关重要的。

    JavaScript闭包函数访问外部变量的方法

    局部作用域又可以细分为函数作用域和块级作用域。闭包是函数和声明该函数的词法环境的组合,即使外部函数已经返回,闭包依然可以访问外部函数的变量。 闭包函数访问外部变量的方法通常有两种:直接引用和通过匿名...

    js闭包函数

    这里,`box`函数返回了一个匿名函数,这个匿名函数可以访问`box`函数作用域内的`user`变量。 ### 闭包的优缺点 **优点:** 1. 可以避免使用全局变量,减少全局命名空间的污染。 2. 可以保护函数内的变量不被外界...

    图解javascript作用域链

    这个过程可以用一个可视化的方式表示,如同图解所示,从下到上依次是全局作用域、匿名函数作用域和`sub`函数作用域。如果在`sub`函数内部尝试访问一个变量,JavaScript会沿着作用域链向上搜索,直到找到该变量或者...

    javascript闭包

    ### JavaScript闭包详解 #### 一、闭包概念与工作机制 **闭包**是JavaScript中最强大的特性之一,它使得函数能够记住并访问其定义时所在的作用域中的变量。要理解和运用闭包,首先需要理解作用域、作用域链以及...

    javascript笔记之匿名函数和闭包

    JavaScript中的匿名函数和闭包是两个非常重要的概念,它们在函数式编程和模块化开发中起着关键作用。 首先,让我们来理解匿名函数。匿名函数,顾名思义,是没有名称的函数。在JavaScript中,我们可以直接定义一个不...

    Javascript闭包实例详解

    首先,闭包是由于JavaScript的函数作用域机制产生的。在JavaScript中,每个函数都有自己的作用域,内部函数可以访问外部函数的变量,但外部函数不能直接访问内部函数的变量。当内部函数被返回或作为返回值时,它依然...

    JavaScript中匿名函数的用法及优缺点详解_.docx

    - 模块化:通过匿名函数,配合var关键字,可以创建私有作用域,避免全局变量污染,如YUI和其他JavaScript库中广泛使用。 - 防止命名冲突:在多个脚本共存的页面中,匿名函数可以降低变量命名冲突的风险。 - 函数...

Global site tag (gtag.js) - Google Analytics