標籤:style blog color 使用 strong io
定義函數的方式
定義函數運算式的方法有兩種,一種是函式宣告,另一種是函數運算式.
函式宣告的方式,關於函式宣告的方式,它的一個重要的特性就是函式宣告提升(function declaration hoisting),意思是在執行代碼之前會先讀取函式宣告。這就意味著可以把函式宣告放在調用它的語句後面,like this
1 sayHi();//聲明函數(function declaration hoisting)2 function sayHi(){3 alert("Hi!");4 }
函數運算式有多種表達方式,下面是最常見的一種
var func = function(agr1,arg2){//建立匿名函數 alert(arg1 + ‘ ‘ + arg2);//函數體 }
函數運算式與其他運算式一樣,使用前必須賦值。比如下面的代碼就會導致錯誤。
var condition = true; //never do this! 不同的瀏覽器會做出不同的行為 不要這麼做! if(condition){ function sayHi(){ alert("Hi!"); } } else { function sayHi(){ alert("Yo!"); } } sayHi();
函數可以賦值給變數,自然也可以當作傳回值返回。
遞迴
就像每一門語言一樣,任何方法或者函數解決問題的思路有遞迴和枚舉兩種基本思路,但是js中的遞迴還是有個小陷阱的,這裡需要注意。看看下面的代碼吧,只是一個簡單的求階乘的函數。
//求階乘,看起來並沒有問題 function factorial(num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } } var anotherFactorial = factorial; factorial = null; alert(anotherFactorial(4)); //error!
這裡隱藏的問題就是,如果先用一個變數anotherFactorial指向factorial函數對象(函數對象哦),再將fatorial置空(相當於window對象的factorial屬性=null),再執行anotherFactorial()時,會發現調用fatorial
時會發生錯誤的,原因是null不是函數。那麼為了避免這樣的問題我們可以這樣改進這個函數,使用arguments.callee可以解決這個問題。
ss