千鋒教育JavaScript全套視頻教程(10天學(xué)會(huì)Js,前端javascrip

函數(shù)--function
聲明式函數(shù)
聲明式函數(shù)在函數(shù)定義之前 可以 調(diào)用
console.log(fn1); // ? fn1(){console.log('定義了一個(gè)聲明式函數(shù)fn1,這是fn1函數(shù)內(nèi)部');}
fn1();
賦值式函數(shù)
賦值式函數(shù)在函數(shù)賦值給變量之前 無(wú)法調(diào)用,如果調(diào)用會(huì)報(bào)錯(cuò)
因?yàn)橘x值式函數(shù)是將函數(shù)賦值給了一個(gè)變量,而變量在聲明之前訪問(wèn)結(jié)果是undefined
所以在將函數(shù)賦值給變量之前,這個(gè)變量的值是undefined,不是函數(shù),所以無(wú)法調(diào)用
函數(shù)
函數(shù) 是一段有名字的代碼塊,完成特定功能的代碼塊
函數(shù)可以減少代碼冗余,方便維護(hù)開發(fā)
特點(diǎn):一次定義,多次使用
函數(shù)的四要素
函數(shù)名 --- 函數(shù)的命名規(guī)則 同 變量的命名規(guī)則
函數(shù)體
函數(shù)的參數(shù)
// 形參 --- 形式參數(shù)
// 實(shí)參 --- 實(shí)際參數(shù)
// 返回值
// 注意:
// 函數(shù)如果不調(diào)用,內(nèi)部的代碼不會(huì)執(zhí)行,只有調(diào)用函數(shù),內(nèi)部代碼才會(huì)自行
函數(shù)的定義
聲明式函數(shù) --- 普通函數(shù)
通過(guò)function關(guān)鍵字定義函數(shù),并且給函數(shù)起名
function 函數(shù)名(){
函數(shù)體
}
// 函數(shù)的返回值 return
// 在函數(shù)內(nèi)部聲明的變量在函數(shù)外部訪問(wèn)不到,只能在函數(shù)內(nèi)部訪問(wèn)
// 如果我們需要在函數(shù)外部使用函數(shù)內(nèi)部所產(chǎn)生的值,如果使用
// 就可以利用 函數(shù)的返回值 實(shí)現(xiàn)
// 函數(shù)執(zhí)行完之后必須有一個(gè)結(jié)果,這個(gè)結(jié)果叫做:返回值。
// 使用 return 關(guān)鍵字來(lái)執(zhí)行函數(shù)的返回值。
// 在函數(shù)內(nèi)部 return 關(guān)鍵字 后面跟的什么那么這個(gè)函數(shù)的返回值就是什么
// return 關(guān)鍵字
// return 關(guān)鍵字 除了可以返回值以外還要一個(gè)作用
// 會(huì) 終止函數(shù)的執(zhí)行
// 在函數(shù)內(nèi)部 只要執(zhí)行了 return 那么這個(gè)函數(shù)就會(huì)停止執(zhí)行,
// 即使后面還有代碼也不會(huì)再執(zhí)行了
// 如果在函數(shù)內(nèi)部沒(méi)有 return 或者 return后面沒(méi)有值,函數(shù)的返回值就是 undefined
變量和函數(shù)
預(yù)解析-變量和函數(shù)的提升
01js運(yùn)行的代碼分為三個(gè)階段
預(yù)編譯
// 檢查代碼是否存在語(yǔ)法上的錯(cuò)誤
// 瀏覽器幫我們做,所做的事情就是基本的語(yǔ)法檢查,
// 除了給我們報(bào)錯(cuò)時(shí),看不見摸不著
預(yù)解析
// 瀏覽器幫我們做,所做的事情就是變量和函數(shù)的提升,
// 對(duì)我們程序中使用var聲明的變量和使用function定義的函數(shù)進(jìn)行預(yù)解析(提升)工作。
執(zhí)行階段
// 從上往下逐行執(zhí)行js代碼
// 注意:
// 對(duì)于函數(shù)在沒(méi)有調(diào)用執(zhí)行時(shí)是不會(huì)進(jìn)入函數(shù)內(nèi)部的
// 只有在函數(shù)被調(diào)用執(zhí)行時(shí)才會(huì)進(jìn)入函數(shù)內(nèi)部
// 對(duì)函數(shù)內(nèi)部的進(jìn)行 預(yù)編譯---預(yù)解析---執(zhí)行階段
02變量的提升
js會(huì)針對(duì)所有使用 var關(guān)鍵字聲明的變量進(jìn)行提升,提升到當(dāng)前作用域的最頂端
針對(duì)變量的提升,只會(huì)提升聲明部分,不會(huì)提升賦值部分
// 因?yàn)樽兞柯暶髁藳](méi)有賦值,結(jié)果就是undefined,所以在賦值之前訪問(wèn)結(jié)果都是undefined
變量名和函數(shù)名重名時(shí)候如何執(zhí)行
// 當(dāng) 變量名 和 函數(shù)名 重名時(shí)
在 提升階段 函數(shù)優(yōu)先
// 在這個(gè)名字的變量聲明賦值之前,訪問(wèn)這個(gè)名字,訪問(wèn)到的都是函數(shù)
在 執(zhí)行階段 變量?jī)?yōu)先
// 在這個(gè)名字的變量聲明賦值之后,訪問(wèn)這個(gè)名字,訪問(wèn)到的都是變量
變量的作用域
// 所謂的變量的作用域就是指變量能夠起作用的范圍
// 根據(jù)變量能夠起作用的范圍,我們將變量分為 全局變量 和 局部變量
全局變量
// 全局變量的作用域是 全局作用域
// 定義在函數(shù)外部,在頁(yè)面的任何位置都能正常訪問(wèn)的變量
局部變量
// 局部變量的作用域是 局部作用域
// 定義在函數(shù)內(nèi)部,只能在該函數(shù)內(nèi)部訪問(wèn)的變量
全局變量和局部變量重名時(shí)
當(dāng) 全局變量 和 局部變量 重名時(shí)
在 函數(shù)外部 訪問(wèn)到的是 全局變量,因?yàn)榫植孔兞吭谌种性L問(wèn)不到
在 函數(shù)內(nèi)部 優(yōu)先訪問(wèn)到的是 局部變量
// 在 函數(shù)內(nèi)部 優(yōu)先訪問(wèn)到的是 局部變量
// 如果 函數(shù)內(nèi)部沒(méi)有這個(gè)名字的局部變量,才會(huì)訪問(wèn)全局變量
變量的作用域鏈
訪問(wèn)變量時(shí)
首先在自身的作用域中查找,如果有就使用
沒(méi)有就往外層作用域查找,如果有就使用
沒(méi)有就繼續(xù)往外層作用域查找,一直會(huì)查到全局作用域
// 當(dāng)變量賦值沒(méi)有var時(shí)
// 會(huì)去在上一個(gè)作用域中找【同名&帶var】
// 找到了 - 直接修改
// 找不到 - 在作用域鏈上找
// 一直找到頂級(jí)全局作用域
// 找到了 - 直接修改
// 找不到 - 自己創(chuàng)建修改(創(chuàng)建一個(gè)全局變量)
遞歸函數(shù)
// 遞歸 本質(zhì)上是一種算法,是一種程序調(diào)用自身的編程技巧。
特點(diǎn):函數(shù)調(diào)用自身
和循環(huán)非常類似(重復(fù)計(jì)算執(zhí)行)。所以遞歸也和循環(huán)一樣,需要一個(gè)出口
// 雖然遞歸和循環(huán)很像,但是遞歸不可以代替循環(huán)
// - 性能不如循環(huán)
// - 內(nèi)存占用過(guò)高(非常致命)
// - 遞歸次數(shù)必須預(yù)期收斂