`
xieyaxiong
  • 浏览: 38940 次
  • 性别: 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;
}

 

 

分享到:
评论

相关推荐

    JS匿名函数、闭包

    在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域; 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁; 但是,当函数返回了一个闭包时,这个函数的作用域将会...

    javascript笔记之匿名函数和闭包

    本文介绍了js匿名函数和闭包的相关内容,供大家参考...闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量 &lt;scri

    深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域

    在这里简单介绍一下:闭包是可以访问在函数作用域内定义的变量的函数。若要创建一个闭包,往往都需要用到匿名函数。 2、模拟块级作用域,减少全局变量。执行完匿名函数,存储在内存中相对应的变量会被销毁,从而...

    JavaScript 匿名函数(anonymous function)与闭包(closure)

    闭包是用匿名函数来实现。闭包就是一个受到保护的变量空间,由内嵌函数生成。“保护变量”的思想在几乎所有的编程语言中都能看到。 先看下 JavaScript 作用域: JavaScript 具有函数级的作用域。这意味着,不能在...

    浅析JavaScript作用域链、执行上下文与闭包

    闭包和作用域链是JavaScript中比较重要的概念,这两天翻阅了一些资料,把相关知识点给大家总结了以下。 JavaScript 采用词法作用域(lexical scoping),函数执行依赖的变量作用域是由函数定义的时候决定,而不是...

    详解JavaScript匿名函数和闭包

    也就是说,闭包可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。匿名函数和闭包可以放在一起学习,可以加深理解。本文主要通过一些简单的小例子,简述匿名函数和闭包的常见用法,仅...

    浅谈JavaScript的闭包函数

     闭包是有权访问另一个函数作用域中的变量的函数。首先要明白的就是,闭包是函数。由于要求它可以访问另一个函数的作用于中的变量,所以我们往往是在一个函数的内部创建另一个函数,而“另一个函数”就是闭包。  ...

    JavaScript 匿名函数和闭包介绍

    闭包:可访问一个函数作用域里的变量的函数; 一 匿名函数 // 普通函数 function box(){ // 函数名是box; return 'Lee'; } box(); // =&gt;Lee; 调用函数; // 匿名函数 function(){ // 匿名函数,会报错; return '...

    JavaScript 编写匿名函数的几种方法

    匿名函数可以有效控制变量作用域,构造闭包 (Closure),防止对全局变量造成污染。在 JavaScript 中,编写匿名函数,有以下几种方法.

    JS闭包、作用域链、垃圾回收、内存泄露相关知识小结

    闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成...

    学习javascript的闭包,原型,和匿名函数之旅

    本文通过示例给大家介绍javascript的闭包,原型,和匿名函数,具体详情请看下文。 一 .&gt;关于闭包 理解闭包 需要的知识 1.变量的作用域 例1: var n =99; //建立函数外的全局变量 function readA(){ alert&#40;n&#41...

    深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解

    函数表达式 1、JavaScript中定义函数有2钟方法:  1-1.函数声明: 代码如下:function funcName(arg1,arg2,arg3){ //函数体} ①name属性:可读取... ①匿名函数(anonymous function,或拉姆达函数):function关键字

    深入理解javascript作用域和闭包

    作用域是一个变量和函数的作用范围,javascript中函数内声明的所有变量在函数体内始终是可见的,在javascript中有全局作用域和局部作用域,但是没有块级作用域,局部变量的优先级高于全局变量,通过几个示例来了解下...

    JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解

    很早就接触过闭包这个概念了,但是一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什么,有什么用,今天在网上看到了一篇讲JavaScript闭包的文章(原文链接),讲得非常好,这下算是彻底明白了JavaScript的闭包...

    javascript DOM 编程艺术

    从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)、文档对象模型(DOM)到基于事件的Web脚本设计,从XML(E4X)到Ajax及JSON,从...

    JavaScript 闭包详细介绍

    《JavaScript高级程序设计》上面这么描述的:闭包是指有权访问另一个函数作用域中的变量的函数。这句话第一次看的时候模模糊糊,似是而非。碰到问题就不会运用了,听别人的分析头头是道,说到底还是没搞明白。现在我...

    JavaScript 闭包机制详解及实例代码

    首先要区分两个概念,一是匿名函数,一是闭包。 所谓匿名函数,就是创建函数没有给定函数名。经常出现的包括函数表达式,就是定义一个匿名函数,然后将函数赋值给某个变量,而此时这个变量就相当于该函数的函数名,...

    Head First JavaScript(17年第1版).zip

    2017.8第一版 高清 目录: 1 JavaScript速览:进入JavaScript的世界 阅读 ...11 匿名函数、作用域和闭包:系统地讨论函数 12 高级对象构造技巧:创建对象 13 使用原型:超强的对象创建方式

Global site tag (gtag.js) - Google Analytics