今天用markdown來寫,方便寫js代碼,富文本不會用,今天有點愁,不說了,直接講知識點!最下面還有面試一般會問的題!
函數(shù)
為什么要有函數(shù)?
在寫代碼的時候,有一些常用的代碼需要書寫多次,如果直接復(fù)制粘貼的話,會造成大量的冗余代碼。
如果修改呢?? 多個頁面呢??
函數(shù)可以封裝一段重復(fù)的JavaScript代碼,它只需要聲明一次,就可以被多次調(diào)用。
重復(fù)代碼、冗余代碼的缺點:
1.代碼重復(fù),可閱讀性差
2.不易維護,如果代碼邏輯改變了,所有地方的代碼都要跟著改變,效率太低。
使用場景 :? 只要js出現(xiàn)的地方都有函數(shù)
?
函數(shù)的聲明與調(diào)用
就相當(dāng)于之前數(shù)組的創(chuàng)建和使用
聲明函數(shù)的語法 :
function函數(shù)名() {
// 函數(shù)體
}
調(diào)用函數(shù)的語法 :
函數(shù)名
函數(shù)名()
特點:
1.函數(shù)聲明的時候,函數(shù)體并不會執(zhí)行,函數(shù)體只有在調(diào)用的時候,才會執(zhí)行;
2.可以調(diào)用多次;
代碼示例 :
// 聲明函數(shù)
functionsayHi() {
console.log('薩瓦迪卡');
}
?
// 調(diào)用函數(shù)
sayHi();
函數(shù)的參數(shù)
?? ? ? function getSum() {
?? ? ? ? var a = 10;
?? ? ? ? var b = 20;
?? ? ? ? console.log(a+b);
? }
?? ? ? //? 打印的是 10+20
?? ? ? getSum();
?? ? ? // 想打印 20+30?? 怎么辦????
?? ? ? getSum();
形參 ( 形式參數(shù) ) : 在函數(shù)聲明時, 設(shè)置的參數(shù)。作用是占位置 。只能在函數(shù)內(nèi)部使用.
實參 ( 實際參數(shù) ) : 在函數(shù)調(diào)用時,傳入的參數(shù)。 作用 : 函數(shù)調(diào)用時,會把實參的值賦值給形參, 這樣形參就有了值, 在函數(shù)體里,,,可以直接使用形參!
語法 :
//帶參數(shù)的函數(shù)聲明
function函數(shù)名(形參1,形參2,形參...){
//函數(shù)體
}
?
//帶參數(shù)的函數(shù)調(diào)用
函數(shù)名(實參1,實參2,實參3);
如何確定形參:
在聲明函數(shù)的時候,碰到不確定的值的時候,就可以定義成形參。
注意:
1.形參在聲明時,值不固定,只有在調(diào)用的時候,形參的值才確定,形參的值會跟著函數(shù)調(diào)用時的實參不一樣而不一樣。
2.如何確定形參:在聲明函數(shù)的時候,碰到不確定的值的時候,就可以定義成形參。
函數(shù)的返回值
當(dāng)函數(shù)執(zhí)行完的時候,我們期望函數(shù)給我一些反饋(比如計算的結(jié)果),這個時候可以讓函數(shù)返回一些東西。也就是返回值。函數(shù)通過return返回一個返回值
返回值語法:
//聲明一個帶返回值的函數(shù)
function函數(shù)名(形參1,形參2,形參...){
//函數(shù)體
return返回值;
}
?
//可以通過變量來接收這個返回值
var變量=函數(shù)名(實參1,實參2,實參3);
函數(shù)返回值注意事項:
★return后面的語句不執(zhí)行。
★函數(shù)可以沒有返回值,函數(shù)如果沒有return,那么返回結(jié)果是undefined。
★函數(shù)的參數(shù)可以有多個,但是返回值只能有1個。
函數(shù)三要素
函數(shù)三要素包括:函數(shù)名、參數(shù)、返回值
注意 : 參數(shù)和返回值可以沒有,,,但是函數(shù)名一定要有;
函數(shù)內(nèi)部可以調(diào)用函數(shù)
在函數(shù)內(nèi)部是可以繼續(xù)調(diào)用別的函數(shù)的。
functionchiFan() {
?
console.log('開始吃飯');
console.log('吃完了');
?? }
functionqiaoDaiMa() {
?
console.log('開始敲代碼');
chiFan()
console.log('代碼敲完了');
?? }
qiaoDaiMa()
遞歸函數(shù)
遞歸函數(shù):自己直接或者間接調(diào)用自己的函數(shù);? 無限調(diào)用
注意 : 遞歸函數(shù)一定要留有出口,不然就是死循環(huán)了
遞歸函數(shù)比較抽象,尤其是第一次接觸的同學(xué)們,大家了解即可。
斐波那契數(shù)列,有個人想知道,一年之內(nèi)一對兔子能繁殖多少對?于是就筑了一道圍墻把一對兔子關(guān)在里面。已知一對兔子每個月可以生一對小兔子,而一對兔子從出生后第3個月起每月生一對小兔子。假如一年內(nèi)沒有發(fā)生死亡現(xiàn)象,那么,一對兔子一年內(nèi)(12個月)能繁殖成多少對?
//兔子的規(guī)律為數(shù)列,1,1,2,3,5,8,13,21 ,34 , 55, 89, 144
場景 : 少用,,性能也不太好!? 100個月
函數(shù)也是一種類型
聲明函數(shù)的兩種方式
方式1 : 函數(shù)聲明:
function函數(shù)名(){
//函數(shù)體
}
方式2 : 函數(shù)表達式 ( 匿名函數(shù) )
var函數(shù)名=function(){
//函數(shù)體
}
函數(shù)可以作為參數(shù)
通常,我們把作為參數(shù)傳遞的函數(shù)叫做回調(diào)函數(shù)
functionfn1(fn) {
fn();
}
fn1(function(){
console.log("哈哈");
});
函數(shù)可以作為返回值
在js高級中,閉包會使用到。
functionfn1() {
returnfunction(){
console.log("呵呵");
?? }
}
fn1()();//調(diào)用
作用域
作用域:變量起作用的區(qū)域
全局作用域 :在script標(biāo)簽內(nèi),函數(shù)外的區(qū)域就是全局作用域,在全局作用內(nèi)聲明的變量叫做全局變量 。全局變量可以在任意地方訪問。
函數(shù)作用域 :在? 函數(shù)內(nèi)的區(qū)域? 叫做函數(shù)作用域,在函數(shù)作用域內(nèi)聲明的變量叫做局部變量 ,局部變量只有在當(dāng)前函數(shù)內(nèi)才能訪問到。
全局變量:在函數(shù)外,script標(biāo)簽內(nèi)聲明的變量就是全局變量,全局變量在任何地方都能訪問的到。
局部變量:在函數(shù)中聲明的變量,就是局部變量,局部變量只有在當(dāng)前函數(shù)體內(nèi)能夠訪問。
隱式全局變量:沒有使用var定義的變量也是全局變量,叫做隱式全局變量。(不要使用)
總結(jié) :
// 全局作用域 : script標(biāo)簽內(nèi), 函數(shù)外
// ? ? ? ? ?? 全局變量 => 任何地方都可以訪問
// 函數(shù)作用域 : 函數(shù)內(nèi)部
// ? ? ? ? ? ? 局部變量 => `當(dāng)前函數(shù)`內(nèi)部
?
// 除了兩個常用的變量還有 隱式全局變量 : 任何地方都能訪問(前提是已經(jīng)好) ? (避免使用)(先執(zhí)行函數(shù))
// 查看哪些是全局、局部、隱式全局
// 計算
varnum=11;
?
functionfn() {
varnum1=12;
num2=22;
console.log(num);
console.log(num1);
}
fn();
console.log(num);
// console.log(num1);
console.log(num2);
變量的查找規(guī)則:
函數(shù)內(nèi)部可以使用函數(shù)外部的變量? (見上例)
有局部變量就用局部變量,沒有局部變量就用全局變量。?
預(yù)解析
?? ? ? console.log(num4);
?? ? // var num4 = '123';
js執(zhí)行代碼分為兩個過程:
預(yù)解析過程(變量與函數(shù)提升)
代碼一行一行執(zhí)行
預(yù)解析過程:分別舉例
// 預(yù)解析過程
// 1. 把var聲明的變量提升到當(dāng)前作用域最前面,不會提升賦值? var num = 19 ; var fn = function() {..}
// 2. 把函數(shù)聲明 提升到當(dāng)前作用域的最前面,, ? function test() {....}
// 3. 如果函數(shù)同名 ???? 后者會覆蓋前者? (帥)
// 4. 如果 var聲明的 和 函數(shù)聲明的同名 ,? 函數(shù)優(yōu)先
面試題:(博主被問到過的面試題)
vara=4;
console.log(a);
a=6;
console.log(a);
functiona() {
console.log('哈');
?? }
?
a();
?
a=10;
console.log(a);
匿名函數(shù)與自執(zhí)行函數(shù)
匿名函數(shù)
匿名函數(shù):沒有名字的函數(shù)
匿名函數(shù)如何使用:
1.將匿名函數(shù)賦值給一個變量,這樣就可以通過變量進行調(diào)用
2.自執(zhí)行(匿名函數(shù)自執(zhí)行)
匿名函數(shù)自執(zhí)行的作用:防止全局變量污染。
// 自執(zhí)行
(functionfn(){
console.log("我可以自己執(zhí)行哦");
})();
?
//張三的代碼
;(function(){
varnum=11;
functionfn() {
console.log("呵呵")
?? }
fn();
console.log(num);
? })();
//李四的代碼
?
注意:分號
// 注意點 : 代碼規(guī)范
vara=10
varb=20
b=a
(function() {
?
console.log(b);
?
?? })();
其實規(guī)范還是看各個大廠的要求,只要大廠內(nèi)部統(tǒng)一風(fēng)格就可以了!