函数声明与函数表达式

函数声明:直接声明一个函数 function fnName() {};function声明必须有方法名,而出现在表达式里的方法名都会被忽略。

函数表达式:通过赋值,将一个变量的引用指向一个指定的function或匿名函数,如:

var fnName = function () {};//可以是匿名函数也可以是具名函数

分析下现两段代码:

<script type="text/javascript">
alert(a);

function a() {
	return 'xx';	
}

var a = function a() {
	return 'x';
}

alert(a);
</script>
<script type="text/javascript">
alert(a);

function a() {
	return 'xx';	
}

var a = function a() {
	return 'x';
}

alert(a);
</script>

两者其实差异并不大,主要是在var a = function a() {}这一点上,IE与其它浏览器解析上存在差异,其中IE是无论是它作为函数表达式或是函数声明,都将提到scope前面。何以见得?

<script type="text/javascript">
	alert(a);
	var k = function a() {
		return 'x';
	}
</script>

image

其它浏览器将提示a未定义(a is not defined),剩下的只是顺序问题。

预解析时,a此时为function a() {},而无论其是否在var a之前或是之后。

<script type="text/javascript">
alert(a);
function a() {
	return 'xx';	
}
var a = '1';
</script>

image

可以理解为在解析<script>代码段时,将var先提前进行声明,提到当前scope前面,然后再对函数表达式进行预解析。var a的定义与function a的位置并无关系,而在执行到var a时,a的引用发生了改变,将会指向值”1”

image

想继续了解具名函数与匿名函数的,可以点击下面的链接查看我之前写的文章:

hi.baidu.com/meteoric_cry/blog/item/65f8d3c4651d64a58326ac23.html

转载请注明出处 :),如有不同意见,欢迎丢鸡蛋。

原文地址:https://www.cnblogs.com/meteoric_cry/p/1833385.html