一、函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
函數(shù)聲明:函數(shù)聲明必須有函數(shù)名,函數(shù)可以在任意地方調(diào)用。
函數(shù)表達(dá)式:前后兩個函數(shù)的名字可以相同也可以不相同, function 后面的這個名字是可以省略的 , function 后面的這個名字只能再函數(shù)內(nèi)部使用 ,函數(shù)調(diào)用只有在函數(shù)表達(dá)式聲明后調(diào)用。
二、什么是變量的聲明前置?什么是函數(shù)的聲明前置
當(dāng)執(zhí)行流進(jìn)入一個作用域后,作用域里面的函數(shù)和變量會被提升到作用域頂部預(yù)先解析,此時(shí)變量被賦值為undefined,變量真正的值不會提升,函數(shù)則是整體被提升,確保所有代碼執(zhí)行之前已經(jīng)全部被解析,無論在哪里調(diào)用此函數(shù)都會執(zhí)行。如下所示
a(); // a
console.log(b); // undefined
function a(){
console.log("a");
}
var b="b";
console.log(b); // b
三、arguments 是什么?
arguments 是一個對應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對象。arguments對象是所有(非箭頭)函數(shù)中都可用的局部變量。你可以使用arguments對象在函數(shù)中引用函數(shù)的參數(shù)。如下代碼:
function a(){
console.log("名字:"+arguments[0]); //名字:小明
console.log("年齡:"+arguments[1]); //年齡:22
console.log("性別:"+arguments[2]); //性別:男
console.log("傳進(jìn)的參數(shù)有幾個:"+arguments.length+"個"); //3個
}
function b(name,age,sex,achievement){
console.log("name:"+name); //name:小紅
console.log("age:"+age); //age:21
console.log("sex:"+sex); //sex:女
console.log("achievement"+achievement) //achievement:A+
console.log("傳進(jìn)的參數(shù)有幾個:"+arguments.length+"個"); //4個
arguments[0]="小青"
console.log("名字被改為"+name+"了"); //名字被改為小青
}
a("小明","22","男");
b("小紅","21","女","A+")
四、函數(shù)的"重載"怎樣實(shí)現(xiàn)
js中沒有重載! 同名函數(shù)會覆蓋。 但可以在函數(shù)體針對不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯。
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
第一次調(diào)用時(shí),沒有sex參數(shù),函數(shù)內(nèi)的sex參數(shù)被賦值為undefined,if的判斷里面的undefined,被轉(zhuǎn)換為false,里面的代碼不會被執(zhí)行,所以實(shí)現(xiàn)了"重載"。
五、立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用?
- 立即執(zhí)行函數(shù)表達(dá)式是什么
定義一個函數(shù)后,立即調(diào)用這個匿名函數(shù);它還有多種寫法:
(function(){alert('立即執(zhí)行函數(shù)')} ()) // 用括號把整個表達(dá)式包起來
(function(){alert('立即執(zhí)行函數(shù)')}) () //用括號把函數(shù)包起來
!function(){alert('立即執(zhí)行函數(shù)')}() // 求反
+function(){alert('立即執(zhí)行函數(shù)')}()
。。。等等
- 作用:
① 是不必為函數(shù)命名,避免了污染全局變量;
② IIFE內(nèi)部形成了一個單獨(dú)的作用域,可以封裝一些外部無法讀取的私有變量。