定義
函數是由事件驅動或者當被調用時可重複執行的代碼塊
好處:減少代碼冗餘 增加靈活性 便於維護 提高可擴展性
定義函數三種方式:
1)函數聲明
function name(){//具體的語句}
2)函數表達式:
var functionName = function(){//具體的語句}
3)藉助內置一個方法(Function),構造函數方式
var functionName = new Function();
形參和實參的區別
形參:當定義一個函數時,在小括號裏寫的變量
實參:在調用一個函數是,寫在括號裏的值或變量
形參和實參是一一對應的,形參比實參多,多餘的形參默認會取到underfined,實參比形參多,多餘的實參無效。
js引擎在執行js代碼時的兩步操作
1、先掃描環境中所有的聲明(變量聲明,函數聲明),將這些聲明提升到對應環境的最頂端
2、具體的代碼執行,在對應的地方進行執行
foo(); //報錯 foo is not a function , is undefined
var foo = function(){ //提升 提升的是函數名
console.log("a");
}
arguments
arguments:在函數內使用,表示傳給該函數的所有的實參的集合
用處://在無法確認形參的個數,有需要傳遞實參時,
function foo(){
console.log(arguments);
console.log(arguments[0]);//取到第一個實參
console.log(arguments[3]);//取到第4個實參
console.log(arguments.length);//實參的個數
console.log(arguments[arguments.length-1]);//去最後一個數
}
return
1.結束函數執行 2。函數的返回值 函數運行之後的結果
//如果一個函數沒有return或者return後面沒有具體的值,則函數的返回值爲undefined
函數作用域
作用域:變量或者函數能夠被訪問到的範圍
全局作用域
1)最外層函數外通過var來聲明的變量或者聲明的函數具有全局作用域
2)在函數內不通過var來定義的變量
3)window對象的屬性和方法具有全局作用域
//當環境中未定義,而直接可以使用的一些變量或者函數
局部作用域
1)在函數內部通過var來聲明的變量
2)函數的形參具有局部作用域,局部變量
//ES5中,函數是區分全局和局部唯一的代碼塊
函數參數
參數選擇順序:
選擇參數時,就近原則,如果有局部,先局部,後全局,最後window,報錯
函數內部有聲明 提升
eg:
var a = 10;
function foo(){
console.log(a); //在函數內部有聲明提升相當於函數開頭有了個var a;
var a = 20;
}
foo();
console.log(a);//兩個值是:underfined 10
// 形參相當於在函數內部聲明瞭var a
事件處理函數
txt.oninput = function(){console.log(txt.value);}//oninput
txt.onchange = function(){console.log(txt.value);}//onchange
構造函數
一個普通函數,當它和new運算符一起使用時,該函數稱爲構造函數,通常會將構造函數的首字母大寫。
//對象類型
var obj = {};//是一個對象,但是這個對象沒有屬性和方法
//如果來取到屬性值,如果來調用方法 對象名.屬性名 對象名.方法名()
//如果一個對象沒有某個屬性或者方法,那麼取值時會得到underfined
//添加屬性 如果對象裏已經有某個屬性,會覆蓋
//刪除 delete person.sexy;
遞歸函數
在一個函數內部調用自身,稱該函數爲遞歸函數