函式是js中最重要的知識點,需要花很多時間理解記憶。這篇筆記主要記錄函式的一些基本概念及相關基礎知識,沒有很深入。
1. 函式宣告(定義函式,不會執行)
// 包含function關鍵字,函式名稱識別符號(add),圓括號,花括號function add () { 函式體}// 或者使用表示式var add = function () { 函式體}
函式命名規範:描述性強,簡潔(駝峰法,下劃線)
2. 函式呼叫(執行函式)
2.1 作為函式呼叫
var ttt = add(4);
以函式形式呼叫的函式一般不使用this。在非嚴格模式下,this指向全域性物件;非嚴格模式下,this為undefined。
2.2 作為方法呼叫
//object為物件object。ttt = add();//呼叫object。ttt();
this指向呼叫它的物件。
巢狀函式作為函式呼叫,其this不是指向全域性物件就是undefined;巢狀函式作為方法呼叫,其this指向呼叫它的物件。
2.3 作為建構函式呼叫
使用關鍵字new。
2.4 間接呼叫(透過call和apply)
透過call()和apply()來指定this的指。
3. 實參和形參(利用arguments調取引數物件)
形參:定義函式時設定的引數
實參:呼叫函式時實際傳入的引數
形參個數>實參個數,未傳值的形參預設為undefined;形參個數<實參個數,多出來的實參自動省略(但是會儲存在arguments物件中)
引數依次傳入,所以傳值時順序不能改變
arguments的callee屬性指代呼叫當前正在執行的函式的函式,用於匿名函式遞迴呼叫自身
var func = function(x) { if(x<=1) return 1; return x * arguments。callee(x-1);}
arguments。length是實參的真實個數,arguments。callee。length是形參的個數
當傳入的引數較多,記憶呼叫順序是一件頭疼的事情,我們可以傳入物件,透過鍵值對的方式規避這個麻煩。
4. 函式屬性、方法和建構函式
4.1 prototype屬性
函式包含prototype屬性,該屬性指向原型物件的引用。
4.2 call()和apply()
兩個方法的第一個實參都是呼叫該函式的母物件(ES5嚴格模式下第一個實參都會程式設計this的值),後面的引數就是要傳入待呼叫的引數
apply()待呼叫的引數需放在陣列中,如f。apply(o,[1,1,2]);而call()則不需要,如f。call(o,1,1,2)
4.3 bind()
ES5新增方法,使用方式如下:
f。bind(o) //將f函式繫結到o物件上
4.4 toString()
數字 ——> 數字型字串
陣列 ——> 包含逗號的字串
函式 ——> 完整函式原碼的字串
物件 ——> [object Object]
4.5 建構函式
// 建構函式(使用Function關鍵字和new關鍵字)var f = new Function(“x”,“y”,“return x*y;”); //最後一個引數就是函式體// 幾乎等價於下面的函式var f = function(x,y){return x*y;};
實際程式設計中很少使用建構函式。