javascript中的函數指的是一個特定代碼塊,可能包含多條語句,以通過名字來供其它語句調用以執行函數包含的代碼語句。
1.聲明函數
(1)構造函數(通過new創建一個函數對象)
var Person=new Function(console.log("jam"));
Person();//jam;
注:此方法不推薦使用。
(2)聲明函數(通過function關鍵字聲明函數)
function Person(name) {
console.log(name);
}
Person('jam');//jam
(3)函數表達式:
var Person=function() {
console.log('jam')
};
Person();//jam
無論通過何種方式創建函數,js中的每個函數都是一個名為Function的全局對象的實例,因此js中的每個函數都可以被視為對象。
2.函數中的arguments.
arguments是一個對象。arguments對象是所有函數的一個局部屬性,本質上是一個類似于數組的對象,里面包含了所有傳遞給函數的參數。
function Person() {
for(var i=0;i<arguments.length,i++) {
console.log(argument[i])//jam,jirengu,hunger
}
}
Person('jam','jirengu','hunger')
//函數中傳入進來的參數講按照順序保存在arguments中,使用argumetns[0],即可訪問arguments對象中的第一個參數,依次類推。
使用arguments.length即可獲得對象中的參數的數量
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,'男') //執行結果如下:
// name:hunger
age:28
sex:男
arguments:['hunger','28','男'];//按順序保存著函數傳入進來的參數。
name:valley//arguments[0]=valley,使第一個參數的值變為了arguments。
getInfo('男') //執行結果如下:
// name:男
age:undefined;
sex:undefined;
arguments:['男'];
name:valley;
//所有的參數都是按順序傳入進來,沒有傳值得就是undefined;
3.函數的重載
-
簡單的說函數重載就是,當兩個函數名相同時,后一個函數聲明會把前一個函數聲明給覆蓋。
function add() {
console.log("被后面的函數覆蓋")
}
function add() {
console.log("覆蓋前面的函數")
}
add()// 覆蓋前面的函數。(執行第二個函數)
4.聲明提升
和變量的聲明前置一樣,函數聲明也會前置。即使函數執行寫在前面也可以執行,因為函數聲明即使在后面,也會前置。fn(); // "1" function fn(){ console.log('1'); } //這是一個簡單的例子。次代碼函數聲明前置后為 function fn() { console.log('1') } fn();//1
下面看一個復雜一點的例子:
sayName('world');
sayAge(10);
function sayName(name) {
console.log('hello',name);
}
var sayAge=function(age) {
console.log(age;)
};
根據函數聲明前置,此代碼等價于以下代碼:
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)
}
當使用函數表達式的方法聲明函數時,函數前置的規則和變量前置的規則一樣
下面看一個函數聲明前置和變量聲明前置混在一起的例子
function fn(fn2) {
console.log(fn2);
var fn2=3;
console.log(fn2)
console.log(fn);
function fn2() {
console.log('fnnn2')
}
}
fn(10);
根據函數聲明前置和變量聲明前置,上面的代碼下面的代碼等價
function fn(fn2) {
var fn2;
function fn2() {
console.log('fnnn2');
}
console.log(fn2);//function fn2() {console.log('fnnn2')},因為此時fn2是一個函數。
fn2=3;
console.log(fn2);//3,此時fn2=3,
console.log(fn)//輸出fn這個函數
}
fn(10);