`
jaesonchen
  • 浏览: 313098 次
  • 来自: ...
社区版块
存档分类
最新评论

javascript closure 闭包

 
阅读更多
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>closure.html</title>
	
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
	<script type="text/javascript" src="../js/jquery-1.11.3.js"></script>

  </head>
  
  <body>
	<div id="div"></div>
	<script type="text/javascript">
	// <![CDATA[
		//如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作:
		var global = (function () {
			return this;
		})();
		function show(str) {
			$("#div").append($("<p></p>").text("" + str));
		}


		//函数可以作为正常数据存在(例如:当参数传递,接受函数式参数或者以函数值返回)都称作第一类函数(一般说第一类对象)。
		//在ECMAScript中,所有的函数都是第一类对象。
		
		//自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量
		function testFun() {
			//localVar属于自由变量,被innerFun引用。
			var localVar = 10;	
			function innerFun(innerParam) {
				show(innerParam + localVar);
			}
			return innerFun;
		}
		var someFun = testFun();
		someFun(20); 	// 30
		
		//闭包是代码块和创建该代码块的上下文中数据的结合。
		//ECMAScript只使用静态(词法)作用域:在创建时确定作用域
		//ECMAScript中,闭包指的是:
		//1.从理论角度:所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。
		// 哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
		//2.从实践角度:以下函数才算是闭包:
		//a.即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
		//b.在代码中引用了自由变量
		
		//ECMAScript闭包的实现
		//因为作用域链,使得所有的函数都是闭包(与函数类型无关: 匿名函数,FE,NFE,FD都是闭包)。
		//只有一类函数除外,那就是通过Function构造器创建的函数,因为其[[Scope]]只包含全局对象。
		//在ECMAScript中,所有的函数都是闭包,因为它们都是在创建的时候就保存了上层上下文的作用域链
		//(不管这个函数后续是否会激活 —— [[Scope]]在函数创建的时候就有了)
		var x = 10;
		function foo() {
			show(x);
		}
		
		(function (funArg) {
		  	var x = 20;
			// 变量"x"在上下文中静态保存的,在函数foo创建的时候就保存了
			funArg(); 	// 10, 而不是20
		})(foo);
		
		//所有对象都引用一个[[Scope]]
		//在ECMAScript中,同一个父上下文中创建的闭包是共用一个[[Scope]]属性的。
		//也就是说,某个闭包对其中[[Scope]]的变量做修改会影响到其他闭包对其变量的读取:所有的内部函数都共享同一个父作用域
		var firstClosure;
		var secondClosure;
		function funcClosure() {
		  	var x = 1;
		  	firstClosure = function () { return ++x; };
		  	secondClosure = function () { return --x; };
			x = 2; 	// 影响 AO["x"], 在2个闭包公有的[[Scope]]中
		
		  	show(firstClosure()); 	// 3, 通过第一个闭包的[[Scope]]
		}
		
		funcClosure();
		show(firstClosure()); 	// 4
		show(secondClosure()); 	// 3
		
		//开发人员在循环语句里创建函数(内部进行计数)的时候经常得不到预期的结果,而期望是每个函数都有自己的值。
		var data = [];
		for (var k = 0; k < 3; k++) {
			data[k] = (function _helper(x) {
				return function () {
		      		show(x);
		    	};
		  	})(k); 	// 传入"k"值
		}
		
		// 现在结果是正确的了
		data[0](); // 0
		data[1](); // 1
		data[2](); // 2
		
		//创建封装的作用域来隐藏辅助对象:
		var test = {};
		// 初始化
		(function (object) {
			var x = 10;
			object.getX = function _getX() {
		    	return x;
			};
		})(test);
		show(test.getX());	// 获得闭包 "x" – 10
		
		var test1 = {};
		test1.getX = (function () {
			var x = 20;
			return function () {
		    	return x;
			};
		})();
		show(test1.getX());	//20

	// ]]>
	</script>
  </body>
</html>

 

分享到:
评论

相关推荐

    closure闭包

    在描述中提到的"求文法的closure闭包"实际上可能是指在编译器设计和解析理论中的另一个概念,与编程语言中的闭包不同。这里所说的"closure"可能是关于正规文法的扩展,即E-closure。在正规文法中,E-closure是对一个...

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

    闭包(Closure)是一个可以包含自由变量的代码块,这个自由变量并不是在这个代码块或任何全局上下文中定义的,而是在定义代码块的环境中定义。简单来说,闭包就是在一个函数内部定义另一个函数,内层函数可以引用...

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ...

    JavaScript闭包(closure).pdf

    JavaScript中的闭包是一种高级特性,它是函数和其周围状态(词法作用域)的组合,即使函数在其定义的作用域之外被调用,它仍然能访问到这些状态。这个概念是JavaScript编程中的核心部分,尤其在处理异步操作、模块化...

    javascript 闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    Javascript 闭包完整解释

    ### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: ... Javascript中有几个非常重要的语言特性——对象、原型...闭包是Closure, 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    javascript闭包高级教程

    ### JavaScript闭包高级教程 #### 简介 在JavaScript编程中,“闭包”是一个非常重要的概念,尤其对于希望深入理解和高效使用JavaScript的开发者来说。简单地说,闭包是一种能够记住并访问其创建时周围环境的函数...

    javascript闭包

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

    javascript中闭包(Closure)详解

    闭包在JavaScript中是一个至关重要的概念,它涉及到函数、作用域和变量持久化的特性。闭包的本质是一个函数,这个函数可以访问并操作其外部函数作用域内的变量,即使外部函数已经执行完毕,这些变量仍然会被保留。这...

    深入理解javascript原型和闭包.pdf

    闭包(Closure)是JavaScript中的另一个重要概念,是指函数和声明该函数的词法环境的组合。闭包允许一个函数访问并操作函数外部的变量。闭包的形成离不开函数嵌套和函数作为返回值的使用。闭包的优点是可以保存状态...

    从理论角度讨论JavaScript闭包

    本文将介绍一个在JavaScript经常会拿来讨论的话题 —— 闭包(closure)。 闭包其实已经是个老生常谈的话题了; 有大量文章都介绍过闭包的内容, 尽管如此,这里还是要试着从理论角度来讨论下闭包, 看看ECMAScript...

    闭包javascript.pdf

    在计算机科学中,闭包(Closure)是一种函数,它在一个包含一个或多个绑定变量的环境中被评估。当这个函数被调用时,它可以访问那些绑定变量。换句话说,闭包可以记住在其创建时周围存在的任何变量的状态,即使在...

    Javascript闭包(Closure)详解

    在深入探讨闭包之前,我们首先需要理解JavaScript中变量的作用域。在JavaScript中,变量的作用域主要分为全局变量和局部变量。全局变量在任何地方都是可见的,而局部变量只在声明它的函数内可见。JavaScript函数的...

    理解javascript函数式编程中的闭包(closure)_.docx

    本篇文章主要探讨JavaScript函数式编程中的一个重要概念——闭包(closure)。闭包是一种特殊的函数,它能记住其定义时的作用域,即使在函数执行完毕后,仍然可以访问到该作用域内的变量。在JavaScript中,每个函数...

    javascript闭包(Closure)用法实例简析

    本文实例讲述了javascript闭包(Closure)用法。分享给大家供大家参考,具体如下: closure被翻译成“闭包”,感觉这东西被包装的太学术化。下面参考书本和网上资源简单探讨一下(理解不当之处务请留意)。 1、什么是...

    Javascript的闭包详解

    前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/...闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可

Global site tag (gtag.js) - Google Analytics