函數(shù)是JS的核心概念脯爪,主要用來封裝語句碍侦,需要注意一下
細(xì)碎的小點(diǎn)
- return語句,一旦return店印,后續(xù)的語句不會繼續(xù)執(zhí)行了冈在,不加return的話,函數(shù)默認(rèn)的返回值是undefined
有關(guān)參數(shù)的理解
函數(shù)不在意它本身到底接收多少參數(shù)按摘,不關(guān)心最后會使用多少參數(shù)包券。因?yàn)楹瘮?shù)只會接收一個數(shù)組纫谅,函數(shù)可以通過arguments對象來訪問這個參數(shù)數(shù)組。關(guān)于這個數(shù)組溅固,我現(xiàn)在知道這些:
arguments對象
這個數(shù)組其實(shí)是個對象付秕,如下:
javascript
var a = function () {var b= 1; var c = 0} //a是一個函數(shù)
typeof a.arguments // Object
但是為什么又說它是數(shù)組呢,因?yàn)樗旧砗軘?shù)組很像侍郭,可以通過方括號加數(shù)字的方法來訪問具體的參數(shù)询吴,同時還有數(shù)組對象有的length屬性。一個有趣的例子:
```javascript
function a (){
console.log("hello" + arguments[0] + arguments[1]);
}
a("hao","xiang"); //hellohaoxiang
這樣子依然是有效的亮元,在函數(shù)執(zhí)行的時候猛计,通過arguments對象的length屬性可以知道被傳遞的參數(shù)個數(shù),還有個更有趣的例子爆捞,是關(guān)于arguments的同步性的:
function doAdd(num1,num2){
arguments[1]=10;
alert(arguments[0] + num2);
}
doAdd(1,1); //11奉瘤,arguments[1]和num2是同步的
傳遞參數(shù)
參數(shù)就是局部變量,對于函數(shù)來說煮甥,傳遞參數(shù)是按值的盗温,基本類型的很好理解,相當(dāng)于變量的復(fù)制苛秕。
對于引用類型來說肌访,還需要留意到此時依然是按值傳遞的,這個值依然是指引用的內(nèi)存地址值艇劫。
證明方法吼驶,需要先創(chuàng)建一個對象,傳遞函數(shù)中店煞,此時在函數(shù)內(nèi)部修改對象的屬性蟹演,此時內(nèi)外是一致的,因?yàn)樗麄兪且环N的一個對象
但是此時如果將參數(shù)重新初始化為兩一個對象顷蟀,那么也就是說此時參數(shù)已經(jīng)指向另一個變量了酒请,和之前的一切無關(guān)。
再探函數(shù)內(nèi)部的屬性
arguments屬性有一個叫做callee的指針鸣个,這個指針指向擁有這個arguments對象的函數(shù)羞反。主要用來接觸耦合,需要明確一下書上關(guān)于遞歸算法的例子
function fac (num) {
switch (num){
case 1 :
return 1;
default: return num * arguments.callee(num-1);
}
}
函數(shù)的另外一個內(nèi)部屬性是this對象
this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象
具體的理解:
this是包含它的函數(shù)作為方法被調(diào)用是所屬的對象 = 包含它的函數(shù) + 作為方法被調(diào)用時 + 所屬的對象
重點(diǎn)內(nèi)容——函數(shù)的屬性和方法
apply()囤萤,這個方法表示在特定的作用域內(nèi)調(diào)用函數(shù)
與call()的區(qū)別在于call在使用時必須指定參數(shù)
bind()方法昼窗,這個方法可以用來創(chuàng)建一個新的實(shí)例,實(shí)例的this值會被綁定到傳給bind()的值上