今天是函數(shù)基礎(chǔ)部分!有點(diǎn)心理準(zhǔn)備!
老規(guī)矩,先放思維導(dǎo)圖!
圖片哪里不懂,結(jié)合下面文字對(duì)應(yīng)理解!

認(rèn)識(shí)函數(shù)
在一個(gè)完整的項(xiàng)目中,某些功能會(huì)被反復(fù)的使用到,那么,我們就將該功能封裝進(jìn)一個(gè)函數(shù),當(dāng)要使用該功能時(shí),直接調(diào)用函數(shù)即可。
注意:函數(shù)是對(duì)功能的封裝
優(yōu)點(diǎn):
1.節(jié)省代碼,使程序結(jié)構(gòu)簡(jiǎn)單易懂,提高代碼的重復(fù)度(重復(fù)利用度)
2.如果修改某個(gè)功能,調(diào)試某個(gè)bug,只需要對(duì)應(yīng)修改函數(shù)即可
函數(shù)概述
結(jié)構(gòu)
function 函數(shù)名(參數(shù)列表) {
語(yǔ)句
return 表達(dá)式;
}
理解
1.function:函數(shù)的關(guān)鍵字,說(shuō)明這是一個(gè)函數(shù);
2.函數(shù)名:遵守標(biāo)識(shí)符的規(guī)則;
3.()參數(shù)列表的開始和結(jié)束
4.參數(shù)列表:是函數(shù)從函數(shù)的調(diào)用者那里獲取的數(shù)據(jù) 可以沒有參數(shù)
5.{}:函數(shù)體的開始和結(jié)束;
6.語(yǔ)句:函數(shù)封裝的功能
7.return 表達(dá)式; :return是給函數(shù)的調(diào)用者返回的數(shù)據(jù)用,返回的數(shù)據(jù)為“表達(dá)式”的值,返回到調(diào)用函數(shù)的地方。
return 表達(dá)式; 可以不顯示的寫出來(lái),如果沒有,我們默認(rèn)返回undefined。
注意:函數(shù)聲明之后不會(huì)被執(zhí)行,只是聲明了而一個(gè)有該功能的函數(shù)。
函數(shù)的調(diào)用
函數(shù)名(參數(shù)列表)
函數(shù)的調(diào)用,可以在函數(shù)的聲明之前
函數(shù)名:具有某種功能的函數(shù)的名字
參數(shù)列表:是調(diào)用者給函數(shù)的數(shù)據(jù)
小例子
編寫一個(gè)簡(jiǎn)單的函數(shù)
簡(jiǎn)單的函數(shù):沒有參數(shù),沒有返回值
introduce();
function introduce() {
console.log("good");
}
函數(shù)的調(diào)用可以在函數(shù)的聲明之前
函數(shù)的參數(shù)
參數(shù)可以有多個(gè),多個(gè)參數(shù)之間用逗號(hào)分隔
函數(shù)調(diào)用的本質(zhì)就是實(shí)參給形參賦值的過(guò)程(對(duì)應(yīng)賦值)
小例子
//此時(shí)str和age稱為形式參數(shù)(形參),本質(zhì)是變量
function myConsole(str, age) {
console.log(str+"he is "+age);
}
//調(diào)用函數(shù)傳的參數(shù)稱為實(shí)際參數(shù)(實(shí)參),本質(zhì)是值
//函數(shù)調(diào)用的本質(zhì)就是實(shí)參給形參賦值的過(guò)程(對(duì)應(yīng)賦值)
myConsole("fanfan is a good girl!", 18, "nice", "beautiful");
注意:
函數(shù)接收參數(shù)沒有任何顧慮,可以接收任意多個(gè)
函數(shù)的返回值
return
function mySum(num1, num2) {
var sum = num1 + num2;
// console.log(sum);//在功能函數(shù)中盡量避免打印
return sum;//結(jié)束函數(shù)的
}
//接收了函數(shù)的返回值的值
var ret = mySum(5, 6);
函數(shù)的作用域
注意:JS中變量的作用域不是以代碼塊來(lái)區(qū)分,而是以函數(shù)來(lái)區(qū)分
變量的作用域:變量能使用的范圍
全局變量:
定義位置:所有函數(shù)以外定義的變量
作用域:那里都能用(這句話不嚴(yán)謹(jǐn),有瑕疵)
局部變量:
定義位置:函數(shù)內(nèi)用var定義的變量
作用域:在定義的當(dāng)前函數(shù)內(nèi)可以使用
var num = 10;
function f(){
num2 = 30;//定義變量,不用var定義的變量默認(rèn)為全局變量
//函數(shù)內(nèi)部可以訪問全局變量
console.log(num);
num++;
var num1 = 20;
console.log(num1);
}
//調(diào)用
f();
console.log(num);
//找不到名為num1的變量,此時(shí)這個(gè)num1是函數(shù)f中的局部變量
//console.log(num1);
//
console.log(num2);
變量的提升
當(dāng)程序進(jìn)入一個(gè)新的函數(shù)時(shí),會(huì)將該函數(shù)中所有的變量的聲明放在函數(shù)開始的位置。僅僅會(huì)提升變量的聲明,不會(huì)提升變量的賦值。
var num = 10;
function f(){
console.log(num);//undefined// 聲明了變量,但是變量沒有被賦值,所以結(jié)果是undefined;
//var num;
//當(dāng)局部變量與全局變量同名時(shí),優(yōu)先使用局部變量。
var num = 20;//num=20
console.log(num);//20
}
f();
//函數(shù)外面使用的是全局變量的num;
console.log(num);//10
函數(shù)也是一種數(shù)據(jù)
用變量保存函數(shù),可以通過(guò)變量訪問函數(shù)(調(diào)用函數(shù))
function fun(){
console.log("good");
}
//用變量保存函數(shù),可以通過(guò)變量訪問函數(shù)(調(diào)用函數(shù))
var f = fun;
//通過(guò)變量執(zhí)行函數(shù)(訪問函數(shù),調(diào)用函數(shù))
//變量名(參數(shù)列表);
f();//此時(shí)f()與fun()相同
fun();//
//函數(shù)可以作為參數(shù)傳遞
匿名函數(shù)
匿名函數(shù):沒有名字的函數(shù)
當(dāng)匿名函數(shù)沒有賦值給另一個(gè)變量時(shí)有兩種優(yōu)雅的用法
1、直接傳遞給函數(shù)
var a = function (){
console.log("sunck is a good man");
};
a();
2、執(zhí)行某些一次性的代碼
function m(mySum, q, w) {
return mySum(q, w);
}
var ret = m(function(a, b){
return a + b;
}, 1, 2);
console.log(ret);
即時(shí)函數(shù)
即時(shí)函數(shù):當(dāng)函數(shù)聲明之后立即執(zhí)行
組成:()()
結(jié)構(gòu):(匿名函數(shù))(給第一個(gè)小括號(hào)中的匿名函數(shù)傳遞的參數(shù))
第二個(gè)小括號(hào)表明函數(shù)立即執(zhí)行,并且給函數(shù)傳參
(function(str){
console.log(str);
})("good girl");
函數(shù)有固有格式,一定要對(duì)應(yīng),基本的概念就是這樣了,網(wǎng)上有很多練習(xí)的習(xí)題??梢宰约赫艺揖毩?xí)練習(xí)。我也給大家找一個(gè)典型的,用函數(shù)的思想好好練習(xí)一樣。