javascript中的函數(shù)指的是一個特定代碼塊壳影,可能包含多條語句,以通過名字來供其它語句調(diào)用以執(zhí)行函數(shù)包含的代碼語句卿城。
1.聲明函數(shù)
(1)構(gòu)造函數(shù)(通過new創(chuàng)建一個函數(shù)對象)
var Person=new Function(console.log("jam"));
Person();//jam添瓷;
注:此方法不推薦使用每庆。
(2)聲明函數(shù)(通過function關(guān)鍵字聲明函數(shù))
function Person(name) {
console.log(name);
}
Person('jam');//jam
(3)函數(shù)表達(dá)式:
var Person=function() {
console.log('jam')
};
Person();//jam
無論通過何種方式創(chuàng)建函數(shù),js中的每個函數(shù)都是一個名為Function的全局對象的實例鹅经,因此js中的每個函數(shù)都可以被視為對象寂呛。
2.函數(shù)中的arguments.
arguments是一個對象。arguments對象是所有函數(shù)的一個局部屬性瘾晃,本質(zhì)上是一個類似于數(shù)組的對象贷痪,里面包含了所有傳遞給函數(shù)的參數(shù)。
function Person() {
for(var i=0;i<arguments.length,i++) {
console.log(argument[i])//jam,jirengu,hunger
}
}
Person('jam','jirengu','hunger')
//函數(shù)中傳入進(jìn)來的參數(shù)講按照順序保存在arguments中蹦误,使用argumetns[0],即可訪問arguments對象中的第一個參數(shù)劫拢,依次類推。
使用arguments.length即可獲得對象中的參數(shù)的數(shù)量
function getInfo(name,age,sex) {
console.log('name:',name);
console.log('age:',age);
console.log('sex:',sex);
console.log('agruments:'argumetns);
arguments[0]='valley';
console.log('name',name)
}
getInfo('hunger',28,'男') //執(zhí)行結(jié)果如下:
// name:hunger
age:28
sex:男
arguments:['hunger','28','男'];//按順序保存著函數(shù)傳入進(jìn)來的參數(shù)强胰。
name:valley//arguments[0]=valley,使第一個參數(shù)的值變?yōu)榱薬rguments舱沧。
getInfo('男') //執(zhí)行結(jié)果如下:
// name:男
age:undefined;
sex:undefined;
arguments:['男'];
name:valley;
//所有的參數(shù)都是按順序傳入進(jìn)來偶洋,沒有傳值得就是undefined;
3.函數(shù)的重載
-
簡單的說函數(shù)重載就是熟吏,當(dāng)兩個函數(shù)名相同時,后一個函數(shù)聲明會把前一個函數(shù)聲明給覆蓋玄窝。
function add() {
console.log("被后面的函數(shù)覆蓋")
}
function add() {
console.log("覆蓋前面的函數(shù)")
}
add()// 覆蓋前面的函數(shù)牵寺。(執(zhí)行第二個函數(shù))
4.聲明提升
和變量的聲明前置一樣,函數(shù)聲明也會前置恩脂。即使函數(shù)執(zhí)行寫在前面也可以執(zhí)行帽氓,因為函數(shù)聲明即使在后面,也會前置俩块。fn(); // "1" function fn(){ console.log('1'); } //這是一個簡單的例子杏节。次代碼函數(shù)聲明前置后為 function fn() { console.log('1') } fn();//1
下面看一個復(fù)雜一點(diǎn)的例子:
sayName('world');
sayAge(10);
function sayName(name) {
console.log('hello',name);
}
var sayAge=function(age) {
console.log(age;)
};
根據(jù)函數(shù)聲明前置,此代碼等價于以下代碼:
function sayName(name) {
console.log('hello',name);
}
var sayAge;
sayName('world');//hello world
sayAge(10);//報錯典阵,sayAge is not a function
sayAge=function(age){
console.log(age)
}
當(dāng)使用函數(shù)表達(dá)式的方法聲明函數(shù)時,函數(shù)前置的規(guī)則和變量前置的規(guī)則一樣
下面看一個函數(shù)聲明前置和變量聲明前置混在一起的例子
function fn(fn2) {
console.log(fn2);
var fn2=3;
console.log(fn2)
console.log(fn);
function fn2() {
console.log('fnnn2')
}
}
fn(10);
根據(jù)函數(shù)聲明前置和變量聲明前置镊逝,上面的代碼下面的代碼等價
function fn(fn2) {
var fn2;
function fn2() {
console.log('fnnn2');
}
console.log(fn2);//function fn2() {console.log('fnnn2')},因為此時fn2是一個函數(shù)壮啊。
fn2=3;
console.log(fn2);//3,此時fn2=3,
console.log(fn)//輸出fn這個函數(shù)
}
fn(10);