函數(shù)就是包裹在大括號中的代碼塊宫静,前面使用了關(guān)鍵詞 function:
一、函數(shù)的聲明
我們聲明一個求數(shù)字立方的函數(shù)券时,函數(shù)在定義之后孤里,并不會執(zhí)行里面的內(nèi)容,只有在函數(shù)進(jìn)行調(diào)用的時候橘洞,才會執(zhí)行捌袜。
// 定義一個求一個數(shù)字的立方的函數(shù),并調(diào)用
function cube(a) {
return a * a * a;
}
var res = cube(3);
1炸枣、函數(shù)表達(dá)式
函數(shù)表達(dá)式虏等,即用變量保存匿名函數(shù)弄唧。上面的式子就是一個函數(shù)表達(dá)式,其中從function后面一直到反大括號包裹的內(nèi)容稱為函數(shù)體霍衫,cube被稱之為函數(shù)名候引,a就是函數(shù)的參數(shù),return后面的內(nèi)容稱之為返回值敦跌。我們只要調(diào)用上面的函數(shù)就可以求出任何一個數(shù)的立方澄干。
二、函數(shù)的參數(shù)和返回值
1峰髓、函數(shù)的參數(shù)傻寂。
觀察上面的函數(shù)表達(dá)式我們會發(fā)現(xiàn)函數(shù)名括號內(nèi)有一個a息尺,這個a就是稱之為函數(shù)的參數(shù)携兵。參數(shù)類型分為兩種:一種叫顯示參數(shù)也叫形參,是我們在定義的時候?qū)懙膮?shù)搂誉,如上面的a即為形參徐紧;另一種叫隱藏參數(shù)也叫實參,是函數(shù)在調(diào)用的時候用的值炭懊,如上面函數(shù)調(diào)用時函數(shù)名后面括號內(nèi)的3即為實參并级。
函數(shù)的參數(shù)一般寫在函數(shù)名后面的小括號內(nèi),如果不寫參數(shù)默認(rèn)是undefined侮腹,函數(shù)的參數(shù)可以是一個嘲碧,也可以是多個,當(dāng)我們不知道到底有多少個參數(shù)的時候可以使用arguments 關(guān)鍵字父阻,它表示函數(shù)中所有參數(shù)組成的數(shù)組愈涩。
2、函數(shù)的返回值(return)加矛。
另外我們查看上面的函數(shù)表達(dá)使會發(fā)現(xiàn)有一個return關(guān)鍵字后面跟著a ×a × a履婉,這就是函數(shù)的返回值。我們將參數(shù)a傳入函數(shù)內(nèi)斟览,再返回三個a的乘積毁腿,函數(shù)調(diào)用時我們就可以通過參數(shù)返回我們想要的結(jié)果。所以有時苛茂,我們會希望函數(shù)將值返回調(diào)用它的地方已烤。通過使用 return 語句就可以實現(xiàn)。在使用 return 語句時妓羊,return 語句后的代碼都不會被執(zhí)行草戈,并返回指定的值。函數(shù)調(diào)用將被返回值取代侍瑟,當(dāng)然也不是所有的函數(shù)都需要返回值唐片,我們可以根據(jù)需求選擇是否添加返回值丙猬。
function fun(a) {
console.log(a);
}
fun('我是一個沒有返回值的函數(shù)')
// 函數(shù)有多個參數(shù)
function func5(a, b) {
var res = a + b;
return res;
}
var res3 = func5(12, 34);
console.log(res3);
// 函數(shù)內(nèi)部使用 arguments 關(guān)鍵字
function func6() {
// 求出所有參數(shù)的和,并返回
var res = 0;
for (var i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
console.log(func6(1, 2, 3, 4, 5, 6));
三费韭、函數(shù)的調(diào)用
1茧球、函數(shù)的調(diào)用方式
聲明函數(shù)后如果沒有調(diào)用,函數(shù)表達(dá)式里面的代碼是不會執(zhí)行的函數(shù)的調(diào)用有兩種方法:一種是直接編寫函數(shù)名后面緊跟小括號星持,如上面我們求立方的函數(shù)我們只用這么寫cube(3)抢埋,即可調(diào)用求出3的立方;第二種是直接調(diào)用也叫自調(diào)用函數(shù)督暂,其語法就是寫兩個小括號揪垄,我們把函數(shù)寫在第一個小括號內(nèi),函數(shù)運行時它會直接運行函數(shù)里面的代碼逻翁。
(function () {
console.log('我是一個自調(diào)用函數(shù)');
})();
(function test() {
console.log('我是另外一個自調(diào)用函數(shù)');
})();
// 自調(diào)用函數(shù)特點:函數(shù)自己執(zhí)行饥努,不需要進(jìn)行調(diào)用
// 自調(diào)用函數(shù),如果有參數(shù)會怎么樣八回?
(function (a, b) {
console.log(a, b);
})(12, 35);
2酷愧、匿名函數(shù)
上面的函數(shù)就是一個自調(diào)用函數(shù),我們會發(fā)現(xiàn)上面的函數(shù)沒有函數(shù)名缠诅,像這種函數(shù)就被稱之為匿名函數(shù)溶浴,我們當(dāng)然也可以給他加上函數(shù)名,但是這并沒有什么卵用管引。注意給它的參數(shù)不是寫在function后面的小括號內(nèi)士败,而是寫在函數(shù)體后面的小括號中。
3褥伴、函數(shù)的調(diào)用順序
我們在聲明變量的時候會在變量前面加一個var關(guān)鍵字谅将,我們在聲明函數(shù)的時候也可以聲明一個變量來接收函數(shù)表達(dá)式。我們都知道變量在聲明之前調(diào)用會報錯顯示undefined噩翠,如果函數(shù)在聲明之前調(diào)用會不會報錯呢戏自,我們可以看以下代碼:
fun(10)
function fun(a) {
console.log(a);
}
add(2,4);
var add = function (a, b) {
return console.log(a+b);
}
fun(10)
function fun(a) {
console.log(a);
}
var add = function (a, b) {
return console.log(a+b);
}
add(2,4);
從上面的代碼我們可以看出,當(dāng)我們用變量接收函數(shù)表達(dá)式的時候只能在函數(shù)聲明后調(diào)用伤锚;當(dāng)我們不用變量接收函數(shù)表達(dá)式的時候擅笔,即使是在函數(shù)聲明之前我們也可以調(diào)用,一定要注意二者之間的區(qū)別屯援。
四猛们、函數(shù)的封裝和閉包
JavaScript允許在函數(shù)內(nèi)部嵌套函數(shù)---即函數(shù)定義和函數(shù)表達(dá) 式位于另一個函數(shù)的函數(shù)體內(nèi)。而且狞洋,這些內(nèi)部函數(shù)可以訪問它們所在的外部函數(shù)中聲明的所有局部變量弯淘、參數(shù)和聲明的其他內(nèi)部函數(shù)。當(dāng)其中一個這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時吉懊,就會形成閉包庐橙,閉包主要就是防止變量污染假勿,下面這段代碼就是一個簡單的閉包。
var add = (function(){
var count = 0;
return function () {
count ++;
console.log(count);
}
})()
add();
函數(shù)封裝就是將一段實現(xiàn)同一個效果的代碼放在一個函數(shù)表達(dá)式內(nèi)态鳖,這樣方便多次調(diào)用也可以防止變量污染转培,比如我們想要取一定范圍內(nèi)的隨機(jī)數(shù),就可以封裝一個函數(shù)浆竭,代碼如下:
//封裝涵數(shù)獲取隨機(jī)數(shù)
function random (min, max) {
return parseInt(Math.random() * (max - min + 1) + min);
}
// 封裝函數(shù)求出圓的面積
function circleArea(r) {
return Math.PI * r * r;
}
console.log(circleArea(10));
五浸须、瀏覽器嗅探
可以獲取瀏覽器內(nèi)核、瀏覽器邦泄、操作系統(tǒng)版本等信息删窒。
- window.navigator.userAgent
以上內(nèi)容純屬個人理解,由于水平有限顺囊,若有錯漏之處敬請指出斧正肌索,小弟不勝感激。