1. 函數(shù)(方法):
實(shí)現(xiàn)了某一個(gè)功能的操作的集合。
函數(shù)的原則:功能單一。
2. 函數(shù)的定義(申明):
函數(shù)的定義并不會(huì)執(zhí)行函數(shù),函數(shù)生效是在調(diào)用的地方。
2.1 使用函數(shù)的關(guān)鍵字function申明
function name(){
}
2.1 使用函數(shù)表達(dá)式申明。一般使用的是匿名函數(shù)
var func = function(){
};
Odiv.onclick = function(){
};
2.3對(duì)象申明法
var func = new Function(a,b,c,'return a+b;')
var func = function(a,b,c){
return a+b;
}
3.函數(shù)的重復(fù)申明
函數(shù)的重復(fù)申明類似于變量的重復(fù)賦值,后面的會(huì)覆蓋前面的。
所以生效的永遠(yuǎn)是后面的函數(shù)。
4. 函數(shù)的提升
函數(shù)的提升類似于變量的提升,在JS里面所有的 變量申明以及函數(shù)申明都會(huì)在執(zhí)行代碼之前運(yùn)行。
函數(shù)內(nèi)部的變量申明,也會(huì)出現(xiàn)變量的提升,但是這個(gè)提升只能提升到函數(shù)的最前面,不能提升到函數(shù)的外部。
5.()
申明的時(shí)候,括號(hào)里面是放置參數(shù)的,不能省略,即使沒有參數(shù)也要有。
調(diào)用的時(shí)候,括號(hào)里面?zhèn)魅氲氖菍?shí)際的數(shù)據(jù),表示函數(shù)的執(zhí)行。
6. 函數(shù)的參數(shù)
JS參數(shù)的意義:能夠獲取到外面的“值”,但是里面的修改不會(huì)影響到外面。
形參:形式參數(shù),函數(shù)定義的括號(hào)里面的,只能是一個(gè)變量。相當(dāng)于一個(gè)占位符,沒有實(shí)際意義,只是方便函數(shù)里面去獲取外面的數(shù)據(jù)。相當(dāng)于給函數(shù)的內(nèi)部申明了一個(gè)變量,不過這個(gè)變量可以獲取外面的數(shù)據(jù)。
實(shí)參:實(shí)際參數(shù),函數(shù)調(diào)用的時(shí)候傳入函數(shù)內(nèi)部的數(shù)據(jù)。必須是具體的值或者變量。
7. 作用域
概念:變量起作用的區(qū)間
全局作用域:函數(shù)外面的叫做全局作用域
局部作用域:函數(shù)內(nèi)部的作用域叫做局部作用域
全局作用域的變量能夠在任何地方使用,局部作用域的變量只能在函數(shù)的內(nèi)部使用,不能再函數(shù)的外部使用。
作用域鏈:
JS所特有的。一個(gè)變量在函數(shù)內(nèi)部找不到的時(shí)候,回去函數(shù)外部查找,如果一直到最外部(window)沒找到那么就產(chǎn)生not defined 錯(cuò)誤,但是有時(shí)候并不是單純的內(nèi)部與外部關(guān)系,而是很多層。這個(gè)時(shí)候內(nèi)部要查找的時(shí)候就要一層一層向外查找,直到找到為止。這個(gè)就是作用域鏈。
8.返回值。
一個(gè)函數(shù)是實(shí)現(xiàn)某一個(gè)功能的,實(shí)現(xiàn)了沒有怎么判斷?
計(jì)算1-100之間所有數(shù)字的和。
function sum(){
var sum =0;
for(var i=1;i<101;i++){
sum+=i;
}
return sum;
}
var a = sum()+10;
函數(shù)胡執(zhí)行完成之后,內(nèi)部的結(jié)果想要告訴函數(shù)的調(diào)用者。那么就要使用函數(shù)的返回值,函數(shù)的返回值只能有一個(gè)。
語(yǔ)法是在所有的函數(shù)內(nèi)部的語(yǔ)句之后添加一條return語(yǔ)句。
想要返回什么就在return后面寫什么。
任何調(diào)用這個(gè)函數(shù)的地方都可以會(huì)去到這個(gè)返回值。
9.函數(shù)申明的優(yōu)先級(jí)
如果一個(gè)表達(dá)式申明的函數(shù)與一個(gè)使用function關(guān)鍵字申明的函數(shù)具有相同的調(diào)用方式。那么最終生效的永遠(yuǎn)是表達(dá)式申明的函數(shù),也就是說表達(dá)式申明的函數(shù)優(yōu)先級(jí)高。
10.不要在if以及所有判斷里面申明函數(shù)。
11.函數(shù)的屬性以及方法。
面向?qū)ο?。函?shù)也是一個(gè)對(duì)象。對(duì)象就是具有方法以及屬性的一個(gè)個(gè)頭。
name屬性: 函數(shù)名。
length屬性:形參參數(shù)的個(gè)數(shù)。
toString():函數(shù)字符串自己。
12.參數(shù)
參數(shù)的默認(rèn)值。有的參數(shù)并不是必須要傳遞的,沒有傳遞的時(shí)候可以設(shè)置一個(gè)默認(rèn)的來執(zhí)行。這個(gè)時(shí)候就可以使用默認(rèn)值語(yǔ)法。
一般來說函數(shù)的在調(diào)用的時(shí)候傳遞的參數(shù)的個(gè)數(shù)要和函數(shù)申明的時(shí)候申明的參數(shù)的個(gè)數(shù)要一致。如果某一個(gè)參數(shù)沒有傳遞,那么實(shí)參與形參的對(duì)應(yīng)關(guān)系式從前向后的。也就是說后面的參數(shù)總是被先省略。
13.參數(shù)的傳遞方式
值傳遞:
var a = 10;
b = a;
b = 11;
a = ? 10
對(duì)于簡(jiǎn)單數(shù)據(jù)類型的參數(shù)傳遞使用的就是值傳遞。(數(shù)字,字符串,布爾值)。
var a = 100;
function s(m){
console.log(m);
console.log(a);
m = 0;
console.log(m);
console.log(a);
}
s(a);
console.log(a);
console.log(m);
引用傳遞(地址傳遞):
var zhangsan = {};//對(duì)象
zhangsan.age = 18;
zhangsan.height = 178;
zhangsan.weight = 180;
function s(b){
b.age = 22;
}
s(zhangsan);
console.log(zhangsan.age);
14.arguments對(duì)象
參數(shù)對(duì)象,能夠在函數(shù)的內(nèi)部獲取到所有傳入的參數(shù)的集合。
是一個(gè)類數(shù)組對(duì)象。
出現(xiàn)原因:
如果傳入的參數(shù)的個(gè)數(shù)是不確定的。例如:返回傳入n個(gè)參數(shù)的最大值。
申明函數(shù)的時(shí)候參數(shù)的個(gè)數(shù)比調(diào)用函數(shù)的時(shí)候傳入的參數(shù)個(gè)數(shù)少。
15.函數(shù)分類
系統(tǒng)函數(shù),JS自己定義好的函數(shù)
自定義函數(shù),用戶自己定義的函數(shù)
.匿名函數(shù):沒有名稱的函數(shù),這個(gè)函數(shù)只是定義的時(shí)候直接賦值生效。
立即函數(shù)(自執(zhí)行函數(shù)):就是函數(shù)在定義的時(shí)候自動(dòng)調(diào)用一次。
不能使用在函數(shù)關(guān)鍵字申明的函數(shù)后面直接加上小括號(hào)不表示執(zhí)行,因?yàn)镴S的解析器認(rèn)為function開始的語(yǔ)句就是函數(shù)定義。
表達(dá)式申明:可以使用表達(dá)式申明的函數(shù)后面加上小括號(hào)表示執(zhí)行。
其實(shí)對(duì)于JS解析器來說只要不是function開始都可以實(shí)現(xiàn)自執(zhí)行。
(function s(){}());
(function(){})();
利用上面的這個(gè)自執(zhí)行的特點(diǎn),可以實(shí)現(xiàn)用戶的一個(gè)局部作用域空間,這樣可以防止變量的污染。
其實(shí)對(duì)于JS解析器來說只要不是使用function開始申明的函數(shù)都是可以加上小括號(hào)表示自執(zhí)行的。
!function s(){}();
~function(){}();
+function(){}();
-function(){}();
16.回調(diào)函數(shù)
就是在某一個(gè)地方(函數(shù)內(nèi)部)根據(jù)一個(gè)條件去調(diào)用其他函數(shù)。
在不修改原代碼的基礎(chǔ)上實(shí)現(xiàn)新的功能。
對(duì)修改封閉,對(duì)擴(kuò)展開放。開放封閉原則。
17.遞歸函數(shù)
在函數(shù)的內(nèi)部自己調(diào)用自己實(shí)現(xiàn)某一個(gè)操作。
遞歸函數(shù)是一定具有結(jié)束條件的,沒有結(jié)束條件就變成了死循環(huán)。