JS中函数声明与函数表达式的异同
注:函数声明和函数表达式的相同点包括但不限于以下几点
function nameAlert(name){ alert('博主的名字是:' + name + ' 。'); } alert(nameAlert); 注意输出的结果并不是1,而是这个函数的整个源代码,即输出结果为: function nameAlert(name){ alert('博主的名字是:' + name + ' 。'); }
nameAlert
作为参数传给了anotherNameAlert
,然后anotherNameAlert
也指向了该函数。
这里就涉及到了函数的传递,函数的传递是传引用,就是说函数存在内存中的某个位置,nameAlert
和anotherNameAlert
是都是函数的一个引用,把函数名nameAlert
赋值给anotherNameAlert
的时候,它们引用的都是同一个函数。
所以anotherNameAlert
的输出结果为:
博主的名字是:myvin 。
function nameAlert(name){ alert('博主的名字是:' + name + ' 。'); } var anotherNameAlert=nameAlert; anotherNameAlert('myvin');
当然函数还有其他特点,在此不再介绍,感兴趣的可以自己总结下。
注:函数声明和函数表达式的不同点包括但不限于以下几点
相对函数声明和函数表达式之间的相同点,它们的不同点更应该值得我们关注。下面我结合自己的理解聊聊。
var variable=function(arg1, arg2, ...){ <!-- function body --> }
var variable=function functionName(arg1, arg2, ...){ <!-- function body --> }
function functionName(arg1, arg2, ...){ <!-- function body --> }
sayTruth();<!-- 函数声明 --> function sayTruth(){ alert('myvin is handsome.'); } sayTruth();<!-- 函数表达式 --> var sayTruth=function(){ alert('myvin is handsome.'); }
function sayTruth(){alert('myvin is handsome')}
,在解析function sayTruth(){alert('myvin is ugly')}
,覆盖了前面的函数声明,当我们调用sayTruth()
函数的时候,也就是到了代码执行期间,声明会被忽略,所以自然会输出myvin is ugly
。
sayTruth(); if(1){ function sayTruth(){alert('myvin is handsome')}; } else{ function sayTruth(){alert('myvin is ugly')}; }
(function(){ alert('博主的名字是:myvin 。'); })()
事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的。对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析,所以在实际中,它们还是会有差异的,具体表现在,当使用函数声明的形式来定义函数时,可将调用语句写在函数声明之前,而后者,这样做的话会报错。
参考链接:http://www.cnblogs.com/myvin/p/4649789.html
http://blog.csdn.net/one_and_only4711/article/details/6361131
优质内容筛选与推荐>>