概述:函數(shù)是用function修飾一個代碼塊,這個代碼塊一般是抽取對應(yīng)的功能代碼形成對應(yīng)的復(fù)用。在一定程度減少代碼冗余。
函數(shù)的核心思想:封裝(封裝完可以被調(diào)用)
函數(shù)分類:
- 系統(tǒng)函數(shù)(屬于系統(tǒng)的函數(shù))
- 內(nèi)置函數(shù)(屬于對應(yīng)的內(nèi)置對象的函數(shù))
- 自定義函數(shù)(自己定義的函數(shù))
函數(shù)的創(chuàng)建(自定義的函數(shù)創(chuàng)建):
1、匿名創(chuàng)建(沒有定義名字,不具備復(fù)用價值)
//自執(zhí)行代碼
(function(){
console.log('hello')
})()
2、具名函數(shù)(有名字的函數(shù),具備復(fù)用價值)
function fn(){
console,log('hello world');
}
fn()
//第二種寫法
var a = function(){
console.log('你好');
}
a()
3、函數(shù)對象創(chuàng)建(使用new關(guān)鍵詞)
//函數(shù)對象創(chuàng)建方式 里面的參數(shù)是字符串
var fn = new Function('alert("123")')
fn()
函數(shù)的參數(shù)傳遞:
//傳遞參數(shù)
//計算兩數(shù)之和,再函數(shù)聲明的時候他傳遞的參數(shù)是形參(變量名)
function sum(a,b){
console.log(a+b);
}
//調(diào)用執(zhí)行,傳遞的參數(shù)是實參 一定有對應(yīng)的值
sum(1,2)
//第二種寫法 new Function的方式傳遞參數(shù)
var sum1 = new Function('a','b','alert+(a+b)')
sum1(1,2)
JavaScript的程序預(yù)編譯過程:
概述:預(yù)編譯過程屬于編譯之前做的事情 。
- 優(yōu)先編譯function
- 優(yōu)先編譯變量(不會進(jìn)行賦值操作)
console.log(a); //undefined
// a() //報錯 a 不是一個函數(shù) 預(yù)編譯不會編譯賦值操作
//調(diào)用 方法名(實際的參數(shù))
fn()
//具名函數(shù)
/* function 函數(shù)名(參數(shù),...){
執(zhí)行的代碼
} */
function fn(){
console.log('hello world');
}
//具名函數(shù)的第二種寫法
var a = function(){
console.log('你好');
}
//調(diào)用
a()
//在JavaScript中程序運(yùn)行有個預(yù)編譯過程
//他會先去加載對應(yīng)的方法 function修飾的方法 加載對應(yīng)的變量 var修飾的變量(并不會優(yōu)先編譯
賦值)
return關(guān)鍵詞:
概述:return意思為返回,它是用于對應(yīng)的函數(shù)中返回對應(yīng)的數(shù)據(jù)的一個關(guān)鍵詞,當(dāng)你的數(shù)據(jù)返回了那么當(dāng)前這個函數(shù)就沒有意義了,所以當(dāng)前這個函數(shù)在return后面的代碼就不會再執(zhí)行了。
fuction 方法名(形參1,形參2,....){
相關(guān)操作
return 數(shù)據(jù)
}
注意:
- 當(dāng)你沒有return關(guān)鍵詞,它也會返回對應(yīng)的數(shù)據(jù),它的返回是在程序執(zhí)行完以后,返回的值為undefined。
- 沒有指定對應(yīng)的數(shù)據(jù),相當(dāng)沒有return,相當(dāng)于將return關(guān)鍵詞放在最后面
return關(guān)鍵詞的特點:
- 它會結(jié)束對應(yīng)的函數(shù),在本身這個函數(shù)的函數(shù)內(nèi)容執(zhí)行了return,那return后面的內(nèi)容將不會再執(zhí)行了。
- 我們一般在程序的結(jié)尾返回對應(yīng)的數(shù)據(jù)。
- 也可以利用對應(yīng)的retrun的特性幫助我們來對應(yīng)的函數(shù)。
function sum(number1,number2){
//如果當(dāng)前傳遞的數(shù)不是數(shù)值 那么就結(jié)束這個函數(shù)
if(typeof number1 != 'number' || typeof number2 != 'number'){
return
}
return number1+number2
}
return 關(guān)鍵詞 和 拋出錯誤(throw new Error())的區(qū)別:
- return 關(guān)鍵詞只是結(jié)束當(dāng)前的函數(shù)
- 拋出錯誤是結(jié)束整個程序
函數(shù)的對應(yīng)的運(yùn)行過程:
gc回收機(jī)制:
概述:垃圾回收機(jī)制,不能強(qiáng)制執(zhí)行的,擁有對應(yīng)的運(yùn)行機(jī)制。
gc的兩大回收機(jī)制:
- 引用計數(shù)法 (針對于引用數(shù)據(jù)類型的,有變量指向當(dāng)前引用就給他+1,當(dāng)這個變量不再指向它就-1,到0就回收了)
- 標(biāo)記清除法 (針對于值類型有用yes,沒有用 no,當(dāng)你是no的時候就回收)
執(zhí)行機(jī)制:
- 函數(shù)是在對應(yīng)的方法執(zhí)行棧上執(zhí)行的
- 打開代碼空間拿出里面的代碼進(jìn)行執(zhí)行
- 當(dāng)你執(zhí)行完以后對應(yīng)的gc就會把這個內(nèi)容從執(zhí)行棧上移走,對應(yīng)的代碼空間就會還原
arguments:
概述:arguments是函數(shù)的里面的所有參數(shù)的集合,它是一個偽數(shù)組(具備數(shù)組特性,有下標(biāo),有l(wèi)ength(長度))
function fn() {
//所有的函數(shù)都具備arguments arguments特殊的值里面包含所有的參數(shù)
console.log(arguments)
//獲取arguments里面的參數(shù)的第一個 arguments[下標(biāo)] 來獲取對應(yīng)的下標(biāo)的值
console.log(arguments[0]);
//查詢當(dāng)前arguments的長度 arguments.length
console.log(arguments.length);
}
//對應(yīng)的下標(biāo)從0開始 0表示第一個 最大值 對應(yīng)的長度-1 length 當(dāng)前的個數(shù)-1
fn(1, 2, 3, 4, 5)
注意:使用arguments來獲取對應(yīng)的值的時候,我們一般不寫形參。
arguments使用的相關(guān):
- arguments通過[下標(biāo)],來返回對應(yīng)的元素
- arguments的length屬性表示傳入?yún)?shù)的個數(shù)
作用域及作用域鏈:
概述:一個變量的作用范圍稱為作用域,在全局聲明的變量就是全局作用域,在函數(shù)內(nèi)聲明的變量它的作用域就是局部作用域(僅在當(dāng)前函數(shù)內(nèi)可用,函數(shù)作用域)
var a = 10 //全局變量 全局作用域
function fn(){
var a = 20 //局部變量 局部作用域
console.log(a) //20
}
console.log(a) //10
作用域鏈:
概述:作用范圍內(nèi)容變量的查找,它是鏈?zhǔn)讲檎?,從局部到全局?/p>
//查找變量的過程 從局部到全局
var a = 10 //全局變量
var c = 50
var b = 60
function fn(){
// console.log(a); //undefined
console.log(a); //10
// var a = 20; //局部
a = 20; //全局的
console.log(b);//60
console.log(c);//undefined
var c = b = 100;
// console.log(a); //20
// console.log(a); //20
(function(){
// console.log(a); //undefined
console.log(a); //20
// var a = 30 //局部
console.log(b);//100
console.log(c);//undefined
var c = b = 200
a = 30 //全局的
// console.log(a); //30
// console.log(a); //30
})()
}
console.log(a); //10
fn()
console.log(a); //30
console.log(b);//200
console.log(c);//50
函數(shù)的嵌套:
概述:函數(shù)是可以互相嵌套的。
function fn(){
function fn1(){
console.log('hello')
//fn(3) //報錯
}
function fn2(){
console.log('hello')
function fn3(){
console.log('hello')
}
}
fn1()
console.log('world')
}
fn() //hello world
注意:在函數(shù)內(nèi)部可以定義函數(shù)和調(diào)用的函數(shù),函數(shù)內(nèi)部不能調(diào)用優(yōu)先級比自己要低的。
事件驅(qū)動(利用對應(yīng)的事件來調(diào)用對應(yīng)的函數(shù)):
簡單的一個dom操作:
獲取對應(yīng)的dom元素
var 變量 = document.getElementById('對應(yīng)的標(biāo)簽的id屬性')
給對應(yīng)的變量添加點擊事件:
變量名.onclick = 處理函數(shù)
遞歸:
概述:遞歸屬于一個對應(yīng)的算法 所有的算法都是套路。遞歸能做所有循環(huán)能做的事情。
遞歸的三大要素 (O(logn)):
- 找規(guī)律
- 找初始值(沒有規(guī)律的已知條件)
- 自己調(diào)用自己