一、函數(shù)的概念
函數(shù)是一段可以反復(fù)調(diào)用的代碼塊煎饼。
作用:在程序設(shè)計中讹挎,常將一些常用的功能模塊編寫成函數(shù),以減少重復(fù)編寫程序段的工作量吆玖。提高代碼的復(fù)用性筒溃、可讀性等
二、函數(shù)的創(chuàng)建方式(函數(shù)的聲明)
(1)function 命令
function命令聲明的代碼區(qū)塊沾乘,就是一個函數(shù)怜奖。function命令后面是函數(shù)名,函數(shù)名后面是一對圓括號翅阵。函數(shù)體放在大括號里面歪玲。
function 函數(shù)名稱() {
? ? 函數(shù)中要執(zhí)行的代碼;
}
function print() {
? console.log(1);
}
上面的代碼命名了一個print函數(shù),以后使用print()這種形式掷匠,就可以調(diào)用相應(yīng)的代碼滥崩。這叫做函數(shù)的聲明
(2)函數(shù)表達(dá)式
除了用function命令聲明函數(shù),還可以采用變量賦值的寫法讹语。
var print = function() {
? console.log(1);
};
這種寫法將一個匿名函數(shù)(沒有名字的函數(shù))賦值給變量钙皮。這時,這個匿名函數(shù)又稱函數(shù)表達(dá)式
函數(shù)的執(zhí)行(調(diào)用)
函數(shù)定義好之后,函數(shù)中的代碼在程序運行過程中不會執(zhí)行短条;
function print() {
console.log(1);
}
通過函數(shù)名稱調(diào)用函數(shù)导匣,調(diào)用時執(zhí)行函數(shù)中的代碼;調(diào)用函數(shù)時茸时,要使用圓括號運算符print();
三贡定、事件的概念種類
事件:就是發(fā)生的事情
事件驅(qū)動:就是發(fā)生了某件事情之后要處理的手段和過程
參數(shù)的聲明
函數(shù)名后面是一對圓括號涂召,里面是傳入函數(shù)的參數(shù)
function 函數(shù)名稱(參數(shù)列表){
? ? 函數(shù)體中的代碼;
}
函數(shù)定義的時候的參數(shù)诫惭,稱為形參
function print(s) {
? console.log(s);
}
function add(a,b) {
? console.log(a+b);
}
參數(shù)的傳遞
print(1)舔庶;
調(diào)用函數(shù)的時候邪意,傳入了 參數(shù)? 1歉闰,1的值給了形參s旦万。
函數(shù)調(diào)用時候傳入的參數(shù)叫做實參
函數(shù)的返回值
JavaScript 引擎遇到return語句莽红,就直接返回return后面的那個表達(dá)式的值,后面即使還有語句竭业,也不會得到執(zhí)行嘱兼。也就是說国葬,return語句所帶的那個表達(dá)式,就是函數(shù)的返回值芹壕。
注汇四、return語句不是必需的,如果沒有的話踢涌,該函數(shù)就不返回任何值通孽,或者說返回undefined。
function add(x, y) {
? return x + y; //返回x+y的和
}
var res = add(1, 1) ;//把函數(shù)的返回值 賦值給 變量res
console.log(res);//2
變量的聲明提升
函數(shù)內(nèi)部會產(chǎn)生“變量提升”現(xiàn)象睁壁。在函數(shù)內(nèi)部使用var命令聲明的變量背苦,不管在什么位置,變量聲明都會被提升到函數(shù)體的頭部潘明。
function foo(x) {
? if (x > 100) {
? ? var tmp = x - 100;
? }
}
// 等同于
function foo(x) {
? var tmp;
? if (x > 100) {
? ? tmp = x - 100;
? };
}
五行剂、arguments
????由于 JavaScript 允許函數(shù)有不定數(shù)目的參數(shù),所以需要一種機制钳降,可以在函數(shù)體內(nèi)部讀取所有參數(shù)厚宰。這就是arguments對象的由來。arguments對象包含了函數(shù)運行時的所有參數(shù)遂填,arguments[0]就是第一個參數(shù)铲觉,arguments[1]就是第二個參數(shù),以此類推吓坚。這個對象只有在函數(shù)體內(nèi)部撵幽,才可以使用。
var f = function (one) {
? console.log(arguments[0]);
? console.log(arguments[1]);
? console.log(arguments[2]);
}
f(1, 2, 3)
通過arguments對象的length屬性礁击,可以判斷函數(shù)調(diào)用時到底帶幾個參數(shù)盐杂。
六漏麦、作用域
作用域(scope)指的是變量存在的范圍。
局部作用域和全局作用域在 ES5 的規(guī)范中况褪,Javascript 只有兩種作用域:一種是全局作用域,變量在整個程序中一直存在更耻,所有地方都可以讀炔舛狻;另一種是函數(shù)作用域秧均,變量只在函數(shù)內(nèi)部存在食侮。
函數(shù)外部聲明的變量就是全局變量(global variable)
在函數(shù)內(nèi)部定義的(使用var)變量,外部無法讀取目胡,顧稱為“局部變量”(local variable)
var v = 1;//全局變量
function f() {
? var b = 2;//局部變量
? console.log(b);
? console.log(v);//它在函數(shù)內(nèi)部可以讀取全局變量锯七,但是局部變量的不能再函數(shù)外部訪問
}
f()
上面的代碼表明,函數(shù)f內(nèi)部可以讀取全局變量v誉己。
函數(shù)內(nèi)部定義的變量眉尸,會在該作用域內(nèi)覆蓋同名全局變量。
var v = 1;
function f(){
? var v = 2;
? console.log(v);
}
f() // 2
v // 1
上面代碼中巨双,變量v同時在函數(shù)的外部和內(nèi)部有定義噪猾。結(jié)果,在函數(shù)內(nèi)部定義筑累,局部變量v覆蓋了全局變量v袱蜡。
注意,對于var命令來說慢宗,局部變量只能在函數(shù)內(nèi)部聲明坪蚁,在其他區(qū)塊中聲明,一律都是全局變量镜沽。
if (true) {
? var x = 5;
}
console.log(x);? // 5
上面代碼中敏晤,變量x在條件判斷區(qū)塊之中聲明,結(jié)果就是一個全局變量缅茉,可以在區(qū)塊之外讀取茵典。
七、遞歸函數(shù):函數(shù)可以調(diào)用自身宾舅,這就是遞歸统阿。簡單來說,就是函數(shù)自己執(zhí)行過程中筹我,調(diào)用自己本身扶平。
遞歸的步驟:
1.先找臨界值,即無需計算 就能獲取的值? ? ?
2.找本次 和上一次的關(guān)系? f(n) = f(n-1)+n? (數(shù)學(xué)歸納)
3.假設(shè)當(dāng)前函數(shù)已經(jīng)可以使用了蔬蕊,調(diào)用自身計算上一次的運行結(jié)果结澄,再寫出本次運行結(jié)果 即可
八、構(gòu)造函數(shù)及對象類型(了解)
面向?qū)ο缶幊蹋∣bject Oriented Programming,縮寫為 OOP)是目前主流的編程范式麻献。它將真實世界各種復(fù)雜的關(guān)系们妥,抽象為一個個對象,然后由對象之間的分工與合作勉吻,完成對真實世界的模擬监婶。
面向?qū)ο缶幊痰牡谝徊剑褪且蓪ο蟪萏摇ο笫菃蝹€實物的抽象惑惶。通常需要一個模板,表示某一類實物的共同特征短纵,然后對象根據(jù)這個模板生成
JavaScript 語言使用構(gòu)造函數(shù)(constructor)作為對象的模板带污。所謂”構(gòu)造函數(shù)”,就是專門用來生成實例對象的函數(shù)香到。它就是對象的模板鱼冀,描述實例對象的基本結(jié)構(gòu)。一個構(gòu)造函數(shù)悠就,可以生成多個實例對象雷绢,這些實例對象都有相同的結(jié)構(gòu)。
構(gòu)造函數(shù)就是一個普通的函數(shù)理卑,但是有自己的特征和用法翘紊。
function Vehicle? () {
? this.price = 1000;
};
上面代碼中,Vehicle就是構(gòu)造函數(shù)藐唠。為了與普通函數(shù)區(qū)別帆疟,構(gòu)造函數(shù)名字的第一個字母通常大寫。
構(gòu)造函數(shù)的特點有兩個宇立。 函數(shù)體內(nèi)部使用了this關(guān)鍵字踪宠,代表了所要生成的對象實例。生成對象的時候妈嘹,必須使用new命令柳琢。new命令的作用,就是執(zhí)行構(gòu)造函數(shù)润脸,返回一個實例對象柬脸。
function Vehicle? () {
? this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
上面代碼通過new命令,讓構(gòu)造函數(shù)Vehicle生成一個實例對象毙驯,保存在變量v中倒堕。這個新生成的實例對象,從構(gòu)造函數(shù)Vehicle得到了price屬性爆价。new命令執(zhí)行時垦巴,構(gòu)造函數(shù)內(nèi)部的this媳搪,就代表了新生成的實例對象,this.price表示實例對象有一個price屬性骤宣,值是1000秦爆。