定義一個(gè)abs
函數(shù)
function abs(x){
log('這是一個(gè)function');
return x<0?-x:x;
}
同時(shí)定義一個(gè)變量abs
闻伶,賦值為一個(gè)匿名函數(shù)
var abs = function(x){
log('這是一個(gè)匿名function');
return x<0?-x:x;
};
情況1: 函數(shù)>變量>執(zhí)行
結(jié)果:全是執(zhí)行變量
function abs(x){
log('這是一個(gè)function');
return x<0?-x:x;
}
var abs = function(x){
log('這是一個(gè)匿名function');
return x<0?-x:x;
};
abs(-1); //匿名
abs(2); //匿名
abs(-8); //匿名
情況2:變量>函數(shù)>執(zhí)行
結(jié)果:全是執(zhí)行變量
var abs = function(x){
log('這是一個(gè)匿名function');
return x<0?-x:x;
};
function abs(x){
log('這是一個(gè)function');
return x<0?-x:x;
}
abs(-1); //匿名
abs(2); //匿名
abs(-8); //匿名
情況3:執(zhí)行>函數(shù)>變量
結(jié)果:全是執(zhí)行函數(shù)
abs(-1); //function
abs(2); //function
abs(-8); //function
function abs(x){
log('這是一個(gè)function');
return x<0?-x:x;
}
var abs = function(x){
log('這是一個(gè)匿名function');
return x<0?-x:x;
};
情況4:執(zhí)行>變量>函數(shù)
結(jié)果:全是執(zhí)行函數(shù)
abs(-1); //function
abs(2); //function
abs(-8); //function
var abs = function (x) {
log('這是一個(gè)匿名function');
return x < 0 ? -x : x;
};
function abs(x) {
log('這是一個(gè)function');
return x < 0 ? -x : x;
}
情況5: 變量>執(zhí)行>函數(shù)
結(jié)果:全是執(zhí)行變量
var abs = function(x){
log('這是一個(gè)匿名function');
return x<0?-x:x;
};
abs(-1); //匿名
abs(2); //匿名
abs(-8); //匿名
function abs(x){
log('這是一個(gè)function');
return x<0?-x:x;
}
情況6: 函數(shù)>執(zhí)行>變量
結(jié)果:全是執(zhí)行函數(shù)
function abs(x) {
log('這是一個(gè)function');
return x < 0 ? -x : x;
}
abs(-1); //function
abs(2); //function
abs(-8); //function
var abs = function (x) {
log('這是一個(gè)匿名function');
return x < 0 ? -x : x;
};
情況7:執(zhí)行>變量>執(zhí)行>函數(shù)>執(zhí)行
結(jié)果:執(zhí)行函數(shù)>變量>變量
abs(-1); //function
var abs = function (x) {
log('這是一個(gè)匿名function');
return x < 0 ? -x : x;
};
abs(-1); //匿名
function abs(x) {
log('這是一個(gè)function');
return x < 0 ? -x : x;
}
abs(-1); //匿名
情況8:執(zhí)行>函數(shù)>執(zhí)行>變量>執(zhí)行
結(jié)果:執(zhí)行函數(shù)>函數(shù)>變量
abs(-1); //function
function abs(x) {
log('這是一個(gè)function');
return x < 0 ? -x : x;
}
abs(-1); //function
var abs = function (x) {
log('這是一個(gè)匿名function');
return x < 0 ? -x : x;
};
abs(-1); //匿名
推論:
- 通過(guò)1和2愧杯,執(zhí)行語(yǔ)句前找到變量和函數(shù)丸氛,先執(zhí)行變量(因?yàn)樽兞刻嵘?/li>
- 通過(guò)3和4,執(zhí)行語(yǔ)句后找到變量和函數(shù)严卖,先執(zhí)行函數(shù)(因?yàn)樽兞刻嵘?/li>
- 通過(guò)5和6全庸,執(zhí)行語(yǔ)句前找到變量(已賦值)或函數(shù)靶端,馬上執(zhí)行
- 通過(guò)7和8,證明前面3個(gè)結(jié)論
變量提升
藤韵,就是變量無(wú)論在哪里定義虐沥,總是后提升到函數(shù)頂部,并賦值為undefined
。
舉個(gè)例子欲险,情況3:
執(zhí)行的時(shí)候镐依,代碼如下:
var abs ; // 變量abs被提升到這里,此時(shí)的值為 undefinded
//執(zhí)行到這一句時(shí)天试,變量abs的值還是undefined槐壳,所以不會(huì)被當(dāng)成函數(shù)來(lái)調(diào)用
//所以,會(huì)去查找 function abs() 調(diào)用
abs(-1); //function
abs(2); //function
abs(-8); //function
function abs(x){
log('這是一個(gè)function');
return x<0?-x:x;
}
//代碼執(zhí)行到這里喜每,abs才進(jìn)行賦值
abs = function(x){
log('這是一個(gè)匿名function');
return x<0?-x:x;
};
如果變量在執(zhí)行語(yǔ)句前已經(jīng)賦值(非undefined
)务唐,那么同名的函數(shù)和變量會(huì)先執(zhí)行變量,如情況1,2,5带兜。反之會(huì)執(zhí)行函數(shù)枫笛,如情況3,4,6。
所以
存在變量(賦值為匿名函數(shù))和函數(shù)同名的情況鞋真,執(zhí)行順序取決于變量的賦值順序(在函數(shù)調(diào)用的前與后)崇堰。