javascript小结之匿名函数与闭包

1、匿名函数

javascript中的匿名函数就是没有名字的函数。

(1)创建函数的三种方式

第一种:最常用的一种

<script type="text/javascript">
	function ff(a) {
		alert(a);
	}
</script>

第二种:使用Function构造函数,把参数列表和函数体都作为字符串,不常用,也不建议使用。

<script type="text/javascript">	
	var ff = new Function("", "alert('dfdf')");
	var gg = new Function("a", "return a");
	ff();
	alert(gg(1));
</script>

第三种:

<script type="text/javascript">	
	var ff = function() {
		alert("df");
	};
	ff();
</script>

注意,等号(=)右边是一个匿名函数,首先在堆中创建了一个函数对象,然后将该函数对象赋给了变量ff。

<script type="text/javascript">	
	var ff = function() {
		return 0;
	};
	alert(typeof ff()); // 返回:number
	alert(typeof ff); // 返回:function
</script>

上面这段代码很重要,第一个是判断函数返回值的类型,第二个是判断该函数变量的类型。

(2)匿名函数的创建

第一种方式:就是上面的那段代码中的写法,等号右边的就是匿名函数,这也是最常用的方式之一。

第二种方式:如下:

<script type="text/javascript">	
	(function(a) {
		alert(a);
	})(1); // 一个括号都不能少,function要用括号包住,最后面的括号表示执行该匿名函数,括号内值为参数。
</script>

尤其要注意上面代码中的括号。

2、闭包

闭包就是指函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕。

<script type="text/javascript">
	var str = "hello";
	setTimeout(function() {
		alert(str);
	}, 1000);
</script>

执行上面代码的时候,预编译期间首先声明了一个变量str,然后赋值为undefined,同时,也定义了一个匿名函数,并且匿名函数已经包括了具体的执行内容。预编译结束以后,在代码运行期间,str首先被赋值为hello,然后运行到setTimeout(),1秒以后,执行前面的匿名函数,匿名函数执行完以后,str及匿名函数对象被从内存中释放。

<script type="text/javascript">
	setTimeout(function() {
		alert(str);  // 我本来以为运行这段代码的时候,输出的会是undefined,但是没想到会是hello,我也懵了。
	}, 0);
	var str = "hello";
</script>

上面这段代码的执行,我没理解清楚,js编译及运行原理这块我理解的还不够透彻,可能有错,姑且先这么理解着吧,以后再来找几本书研究研究,下面还有一段:

<script type="text/javascript">
	alert((function() {
		return str; // 对于这段代码我能理解输出为undefined
	})());
	var str = "hello";
</script>

上面这段代码,我的理解是预编译期间首先定义了一个匿名函数,也声明了str变量,并初始化str为undefined,然后代码运行期间,匿名函数执行返回str,由于str此时还是undefined,所以输出undefined。

本文标题:javascript小结之匿名函数与闭包

本文链接:http://yedward.net/?id=253

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章