Jimmy小站

小明也有大梦想 — 蒋明/铭
当前位置:网站首页 / 前端开发笔记 / 正文

javascript的闭包

2016-06-25 / 前端开发笔记 / 3687 次围观 / 0 次吐槽

首先,作为javascript与其他编程语言最大区别的地方就是 函数的闭包。

这里我说明一下我对javascript闭包的理解。所谓闭包,就是包含所需必要元素的全集。比如在一个function内,需要用到某一个变量,系统会通过各种途径搜寻,直到找到该变量(因此,在function中嵌套function 就相当于使用了函数闭包功能)。

首先从本地环境中查找,如果没有找到则一层一层的向外层环境中查询。因此内部的function可以不需要显式传参,就可以使用外部变量。(比如你需要在学校教务处盖章,但是学校教务处要求必须先在学院教务处签字,一般的编程语言的做法是必须要你先去学院签字,而javascript的做法是他直接拿着你的单子,让学院教务处签好字,然后自己盖好章,最后直接把单子给你。他的工作包含了所有你必须要完成的所有任务。即你不需要显式传参,他会帮你在外层环境中找到所需的变量)

这样的做法对于编程来说,能够省去许多不必要的麻烦,这也是javascript的特点之一。但是这样的参数引用也有很多的缺陷。因为对于这样的传参方式,不管是不是对象类型的变量,都使用引用形式传参。如果内部多次修改并返回该变量,会使得所有返回值都是一样的,因为他们返回的是同一个地址空间存放的变量。示例如下,我们需要的是t2的结果,所以我们需要显式传参,避免对于所有返回值是同一个引用。

function createFunctions () {
	var resul = new Array();
	for (var i = 0; i < 10; i++) {
		resul[i] = function(){
			return i;
		}
	}
	return resul;
}

function createFunctions2 () {
	var resul = new Array();
	for (var i = 0; i < 10; i++) {
		resul[i] = function(num){
			return function(){
				return num;
			}
		}(i); //匿名函数传参的写法,将i赋值给num
	}
	return resul;
}

function test () {
	var resul = createFunctions();
	var t = [];
	var resul2 = createFunctions2();
	var t2 = [];
	for (var i = 0; i < resul.length; i++) {
		t.push(resul[i]());
	}
	for (var i = 0; i < resul2.length; i++) {
		t2.push(resul2[i]());
	}
	//alert("createFunctions  :" + t);
	//alert("createFunctions2 :" + t2);
	document.getElementById("t").innerHTML = "createFunctions  :" + t;  // createFunctions :10,10,10,10,10,10,10,10,10,10
	document.getElementById("t2").innerHTML = "createFunctions2:" + t2; // createFunctions2:0,1,2,3,4,5,6,7,8,9
}


推荐您阅读更多有关于“js,”的文章

[一个Java程序猿的转型之路,读研深造,专注机器学习推荐算法]
本站所有文章如无特别注明均为原创。作者:吉米酱 ,复制或转载请以超链接形式注明转自 Jimmy小站
原文地址《javascript的闭包
额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996