定義函數(自定義函數)javascript
函數就是功能、方法。函數可以幫咱們封裝一段代碼,這一段代碼會具有某一項功能,函數在執行時,封裝這一段都會執行一次,實現某種功能。java
並且,函數能夠屢次調用。算法
1、函數的定義和調用編程
語法:模塊化
定義:把須要實現的功能預先作好函數
執行:在須要的時候執行這個功能,並且能夠根據須要屢次執行spa
定義:function name(){ }3d
執行:name();code
語法解釋:orm
function 定義函數的關鍵字
name 函數名稱
() 參數集
{} 函數體,執行的代碼都放在{}中
//定義一個函數,函數就是一組語句的集合 function haha(){ console.log(1); console.log(2); console.log(3); console.log(4); } haha(); //調用haha函數 haha(); //調用haha函數 haha(); //調用haha函數
函數的意義1:在出現大量程序相同的時候,能夠封裝爲一個function,這樣只調用一次,就能執行不少語句。
2、函數的參數
定義在函數內部的語句,都是相同的,可是實際上能夠經過「參數」這個東西,來讓語句有差異。
定義函數的時候,內部語句可能有一些懸而未決的量,就是變量,這些變量,要求在定義的時候都羅列在小括號中
function fun(a){ console.log("第"+ a +"次說愛你"); } fun(100); fun(1); fun(2); fun(3);
運行結果:
實參(實際參數)和形參(形式參數)
羅列在function小括號中的參數,叫作形式參數;調用時傳遞的值,叫作實際參數。每次調用均可以傳遞不一樣的參數
function fun(a,b){ console.log(a + b); } fun(3,5); //輸出8 fun(8,20); //輸出28 fun("10",24); //輸出1024,作的是連字符串 fun(10); //輸出NaN,由於計算的就是10+undefined = NaN fun(10,20,30,40,50); //輸出30,只有前兩個參數被形參接收了,後面的參數無視
函數的意義2:在調用一個函數的時候,不用關心函數內部的實現細節,甚至這個函數是你上網抄的,能夠運用。
function sum(m,n){ var s = 0; for(var i = m; i <= n;i++){ s = s + i; } console.log(s); } sum(1,100); //5050 計算1+....+100 sum(10,13); //10+11+12=13 sum(10,10000); sum(13,10); //輸出0,因此你就知道了函數的順序關機,定義順序是什麼,傳遞順序就是什麼。 sum(1,6);
3、函數的返回值
函數能夠經過參數來接收東西,更能夠經過return的語句來返回值,「吐出」東西。
function sum(a,b){ return a+b; //如今這個函數的返回值是a+b的和 } console.log(sum(2,3));//sum沒有輸出功能,要用console.log輸出,計算sum(2,3)實際上成爲一個表達式,須要計算,計算後就是5 console.log(sum(3,sum(4,5)));//輸出12,實際上有兩次執行了sum函數,先執行最內層,計算出9,而後sum(3,9),結果就是12
函數能夠接收不少值,返回一個值。
函數意義3:模塊化編程,讓複雜的邏輯變得簡單。
函數只能有惟一的return,有if語句除外。
程序碰見return,將當即返回結果,返回調用它的地方,而不執行函數內後面剩餘的語句。
function fun(){ console.log(1); console.log(2); return; //返回一個空值,undefined console.log(3); //這行語句不執行,由於函數已經return了,因此會終止執行後面的代碼 } console.log(fun());
結果爲:
4、應用函數簡化編程-模塊化
實現前提:函數有返回值,能夠做爲其餘函數執行時傳的實參。
習慣將複雜工做,進行一步步的分工,將一部分工做的結果做爲下一步工做的條件。
將程序中某個單獨的功能製做成單獨函數,這就是造輪子的過程。
業務邏輯上:將全部的輪子進行拼裝。
將程序分紅有層次的模塊,製做過程當中一部分函數要有返回值,執行結果做爲另外一些模塊的參數、條件。
案例:輸出1~1000的全部的質數。所謂質數,就是隻有1、本身兩個約數,沒有其餘約數
邏輯思惟:約數個數→判斷質數
<script type="text/javascript"> //封裝約數個數的函數: 能傳入一個數字,實現這個數約數的個數 function yueshugeshu(a){ var count=0; for(var i=1; i<=a; i++){ if(a%i==0){ count++; } } return count; //返回這個數約數的個數 } //判斷是不是質數,若是一個函數名字取is,就暗示將返回布爾值。一般是真假作法,不是規定 function isZhiShu(m){ if(yueshugeshu(m)==2){ return true; }else{ return false; } } //判斷1到1000的質數 for(var i=1; i<=1000; i++){ if(isZhiShu(i)){ console.log(i); } } </script>
5、函數的遞歸
函數能夠本身調用本身,就是遞歸。
function haha(){ console.log("哈哈"); haha(); //調用本身 } haha();
案例
斐波那契數列就是經典的遞歸算法:
輸出斐波那契數列:
1、1、2、3、5、8、13、21、34、55、89、144、233...
只須要一個函數,就能夠搞定所有問題
fib(n) 就能獲得第n位的數字
fib(2) = 1
fib(5) = 5
fib(6) = 8
fib(10) = 55
function fib(n){ if(n==1 || n==2) { return 1; }else{ return fib(n-1)+fib(n-2) } } // -點點計算 for(var i=1; i<=55; i++){ console.log(fib(i)); }
6、函數表達式
定義函數除了使用function以外,還要一種方法,就是函數表達式。就是函數沒有名字,稱爲「匿名函數」。
爲了從此可以調用它,咱們會把這個匿名函數,直接賦值給一個變量。
var haha = function(){ console.log(1) } haha();
等價於
function haha(){ console.log(1); } haha(); //之後想調用這個函數的時候,就能夠直接使用haha變量調用
7、函數聲明的提高(預解析)
//先調用 fun(); //能夠輸出,由於函數有函數聲明頭提高的特性 fun(); fun(); //後定義 function fun(){ console.log("我是函數,我執行了"); }
JS在執行前,會有一個預解析的過程,把全部的函數聲明,都提高到最最開頭,而後再執行第一行語句。
因此,function定義在哪裏,都不重要,程序總能找到這個函數
fun2(); var fun2 = function(){ //這是函數表達式,而不是function定義法 console.log("我是函數,我執行了"); }
結果爲
函數聲明會被提高,可是函數表達式卻不會被提高
8、函數是一個引用類型
以前說過,基本類型:number、string、Boolean、undefined、null
引用類型也有不少種:object、function、array、RegExp、Math、Date
var haha = function(){ } function fun(){ } console.log(typeof haha); //引用類型中的function類型 console.log(typeof fun); //引用類型中的function類型