函數(shù)(Function)
- 函數(shù)也是一個(gè)對(duì)象拟逮,也具有普通對(duì)象的功能
- 函數(shù)中可以封裝一些(功能)代碼总处,在需要的時(shí)候可以去調(diào)用函數(shù)來(lái)執(zhí)行這些代碼
- 使用typeof檢查一個(gè)函數(shù)時(shí)會(huì)返回function
1.創(chuàng)建一個(gè)函數(shù)
a. 可以將要封裝的代碼以字符串的形式傳遞給構(gòu)造函數(shù)
-
實(shí)際開(kāi)發(fā)中很少使用構(gòu)造函數(shù)來(lái)創(chuàng)建一個(gè)函數(shù)對(duì)象
var fun = new Function("console.log('Hello 這是我的第一個(gè)函數(shù)');"); console.log(fun);//console.log('Hello 這是我的第一個(gè)函數(shù)');
封裝到函數(shù)中的代碼不會(huì)立即執(zhí)行
函數(shù)中的代碼會(huì)在函數(shù)調(diào)用的時(shí)候執(zhí)行
調(diào)用函數(shù) 語(yǔ)法,函數(shù)對(duì)象()
-
當(dāng)調(diào)用函數(shù)時(shí),函數(shù)中封裝的代碼會(huì)按照順序執(zhí)行
fun();//Hello 這是我的第一個(gè)函數(shù) fun.hello ="你好"; console.log(fun.hello);//你好
b.函數(shù)聲明創(chuàng)建一個(gè)函數(shù)
function 函數(shù)名([形參1,形參2...形參N]){
語(yǔ)句...
}
function fun2(){
console.log('Hello 這是我的第二個(gè)函數(shù)');
}
-
調(diào)用fun2
fun2();//Hello 這是我的第二個(gè)函數(shù)
c.函數(shù)表達(dá)式創(chuàng)建一個(gè)函數(shù)
var 函數(shù)名 = function([形參1,形參2...形參N]){
語(yǔ)句...
};
var fun3 =function(){
console.log('我是匿名函數(shù)中封裝的代碼');
}
-
調(diào)用fun3
fun3();//我是匿名函數(shù)中封裝的代碼
2.函數(shù)的參數(shù)
形參和實(shí)參
- 形參:形式參數(shù)
- 定義函數(shù)時(shí)修肠,可以在()中定義一個(gè)或多個(gè)形參,形參之間使用,隔開(kāi)定義形參就相當(dāng)于在函數(shù)內(nèi)聲明了對(duì)應(yīng)的變量但是并不賦值户盯,形參會(huì)在調(diào)用時(shí)才賦值嵌施。-
實(shí)參:實(shí)際參數(shù)
- 調(diào)用函數(shù)時(shí),可以在()傳遞實(shí)參莽鸭,傳遞的實(shí)參會(huì)賦值給對(duì)應(yīng)的形參,
調(diào)用函數(shù)時(shí)JS解析器不會(huì)檢查實(shí)參的類(lèi)型和個(gè)數(shù)吗伤,可以傳遞任意數(shù)據(jù)類(lèi)型的值。注意是否可能接收到非法參數(shù)硫眨,如果有可能則需要對(duì)參數(shù)進(jìn)行類(lèi)型檢查足淆。
如果實(shí)參的數(shù)量大于形參,多余實(shí)參將不會(huì)賦值礁阁,
如果實(shí)參的數(shù)量小于形參巧号,則沒(méi)有對(duì)應(yīng)實(shí)參的形參將會(huì)賦值undefinedfunction sum(a,b){ console.log(a+b); } sum(1,2);//3 sum(123,"hello");//123hello sum(true,false);//1 sum(1,2,"hello");//3 sum(123);//NaN
實(shí)參可以是任意的數(shù)據(jù)類(lèi)型,也可以是一個(gè)對(duì)象
當(dāng)我們的參數(shù)過(guò)多時(shí)姥闭,可以將參數(shù)封裝到一個(gè)對(duì)象中丹鸿,然后通過(guò)對(duì)象傳遞function mianji(r){ return 3.14*r*r; } result = mianji(5); console.log("result = "+result); /* * 創(chuàng)建一個(gè)函數(shù),可以在控制臺(tái)中輸出一個(gè)人的信息 * 可以輸出人的 name age gender address * * 實(shí)參可以是任意的數(shù)據(jù)類(lèi)型棚品,也可以是一個(gè)對(duì)象 * 當(dāng)我們的參數(shù)過(guò)多時(shí)靠欢,可以將參數(shù)封裝到一個(gè)對(duì)象中廊敌,然后通過(guò)對(duì)象傳遞 */ function sayHello(o){ //console.log("o = "+o); console.log("我是"+o.name+",今年我"+o.age+"歲了,"+"我是一個(gè)"+o.gender+"人"+",我住在"+o.address); } //sayHello("豬八戒",28,"高老莊","男"); //創(chuàng)建一個(gè)對(duì)象 var obj = { name:"孫悟空", age:18, address:"花果山", gender:"男" }; sayHello(obj);
實(shí)參可以是一個(gè)對(duì)象,也可以是一個(gè)函數(shù)
function fun(a){
console.log("a = "+a);
//a(obj);
}
//fun(sayHello);
//fun(function(){alert("hello")});
fun(mianji(10));
/*
* mianji()
* - 調(diào)用函數(shù)
* - 相當(dāng)于使用的函數(shù)的返回值
*
* mianji
* - 函數(shù)對(duì)象
* - 相當(dāng)于直接使用函數(shù)對(duì)象
*/
3.返回值
可以使用 return 來(lái)設(shè)置函數(shù)的返回值
語(yǔ)法:return 值
return后的值將會(huì)會(huì)作為函數(shù)的執(zhí)行結(jié)果返回门怪,
可以定義一個(gè)變量骡澈,來(lái)接收該結(jié)果
在函數(shù)中return后的語(yǔ)句都不會(huì)執(zhí)行
如果return語(yǔ)句后不跟任何值就相當(dāng)于返回一個(gè)undefined,
如果函數(shù)中不寫(xiě)return掷空,則也會(huì)返回undefined
return后可以跟任意類(lèi)型的值
/* 創(chuàng)建一個(gè)函數(shù)肋殴,用來(lái)計(jì)算三個(gè)數(shù)的和*/
function sum(a , b , c){
//alert(a + b +c);
var d = a + b + c;
return d;
//return undefined;
}
//調(diào)用函數(shù)
//變量result的值就是函數(shù)的執(zhí)行結(jié)果
//函數(shù)返回什么result的值就是什么
var result = sum(4,7,8);
//var result = alert("hello");
console.log("result = "+result);
function fun(){
alert("函數(shù)要執(zhí)行了~~~~");
for(var i=0 ; i<5 ; i++){
if(i == 2){
使用break可以退出當(dāng)前的循環(huán)
//break;
continue用于跳過(guò)當(dāng)次循環(huán)
//continue;
使用return可以結(jié)束整個(gè)函數(shù)
//return;
}
console.log(i);
}
alert("函數(shù)執(zhí)行完了~~~~");
}
4.立即執(zhí)行函數(shù)
函數(shù)定義完,立即被調(diào)用坦弟,這種函數(shù)叫做立即執(zhí)行函數(shù)
立即執(zhí)行函數(shù)往往只會(huì)執(zhí)行一次
(function(){
alert("我是一個(gè)匿名函數(shù)~~~");
})();
(function(a,b){
console.log("a = "+a);
console.log("b = "+b);
})(123,456);