函數(shù)表達(dá)式和函數(shù)聲明
var test=function(){} #函數(shù)表達(dá)式 function test(){} #函數(shù)聲明
函數(shù)調(diào)用方式
var test=function(){}
test()
function(){}() //SyntaxError:Unexpected token )
如果是在一條語句后面加上括號,那么該括號只是用來控制優(yōu)先級的。所以上面的代碼相當(dāng)于聲明了一個函數(shù),然后執(zhí)行()語句,但是()中內(nèi)容為空,所以報錯。
正確方式:
(function test(){}())
函數(shù)表達(dá)式與函數(shù)聲明的應(yīng)用
1.使用函數(shù)表達(dá)式
if (true) {
var foo = function () {
document.write("1");
}
}
else {
var foo = function () {
document.write("2");
}
}
foo();//1
調(diào)整位置后
foo();//undefined
if (true) {
var foo = function(){
document.write( "1" );
}
}
else {
var foo = function(){
document.write( "2" );
}
}
javascript解釋器在解釋代碼時會將變量聲明先提升到塊級作用域最前端,即
var foo;
foo();//undefined
if (true) {
foo = function () {
document.write("1");
}
}
else {
foo = function () {
document.write("2");
}
}
2.使用函數(shù)聲明
if (true) {
function foo() {
document.write("1");
}
}
else {
function foo() {
document.write("2");
}
}
foo(); // 2
原來函數(shù)聲明和變量一樣,都有一個提升的過程,而和函數(shù)表達(dá)式只會提升聲明不一樣,函數(shù)聲明即會提升聲明,也會提升定義,所以第二個foo的定義把第一個foo給替換掉了,即
function foo() {
document.write("1");
}
function foo() {
document.write("2");
}