函数声明与函数表达式
函数声明:直接声明一个函数 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>
其它浏览器将提示a未定义(a is not defined),剩下的只是顺序问题。
预解析时,a此时为function a() {},而无论其是否在var a之前或是之后。
<script type="text/javascript"> alert(a); function a() { return 'xx'; } var a = '1'; </script>
可以理解为在解析<script>代码段时,将var先提前进行声明,提到当前scope前面,然后再对函数表达式进行预解析。var a的定义与function a的位置并无关系,而在执行到var a时,a的引用发生了改变,将会指向值”1”
想继续了解具名函数与匿名函数的,可以点击下面的链接查看我之前写的文章:
hi.baidu.com/meteoric_cry/blog/item/65f8d3c4651d64a58326ac23.html
转载请注明出处 :),如有不同意见,欢迎丢鸡蛋。