javascript
从头开始学JavaScript (七)——函数
一、return
函數(shù)在執(zhí)行完return之后停止并立即退出。
return返回值;與return;
如下兩個例子:
1 function sum(num1, num2) { 2 num1= num1 + num2; 3 return num1; 4 } 5 6 var result = sum(5, 10); 7 alert(result);//15 function sum(num1, num2) {num1= num1 + num2;return;}var result = sum(5, 10);alert(result);//undefined;直接return而不帶任何參數(shù)的情況一般用于需要提前停止函數(shù)執(zhí)行而又不需要返回值的情況。
如下:
function counter() {for (var count = 1; ; count++) {console.log(count + "A");if (count === 5) {return;}console.log(count + "B");}console.log(count + "C"); }counter();二、參數(shù)
ECMAscript函數(shù)參數(shù)的特點;
- 不介意傳遞進來多少個參數(shù)
- 不介意傳遞進來的參數(shù)的數(shù)據(jù)類型
之所以有上述兩個特點,是因為ECMAscript參數(shù)在內(nèi)部是用一個數(shù)組表示的。函數(shù)接收到的始終是這個數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù),或者是否有參數(shù)。
實際上,在函數(shù)體內(nèi)可以通過arguments對象來訪問這個參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個參數(shù)。
例如:
function sayHi(name, message) {alert("Hello " + name + ", " + message); }sayHi("楊小漾", "how are you today?");也可以寫成:
function sayHi() {alert("Hello " + arguments[0]+ ", " + arguments[1]); }sayHi("Nicholas", "how are you today?");因此,在javascript里面,給參數(shù)命名只是提供便利,并不是必需的。
使用arguments.length可以獲知有多少個參數(shù)傳遞給了函數(shù),例如:
function howManyArgs() {alert(arguments.length);}howManyArgs("string", 45); //2howManyArgs(); //0howManyArgs(12); //1利用這一點,可以讓函數(shù)接受任意個參數(shù)并分別實現(xiàn)相應(yīng)的功能:
1 function doAdd() { 2 if(arguments.length == 1) { 3 alert(arguments[0] + 10); 4 } else if (arguments.length == 2) { 5 alert(arguments[0] + arguments[1]); 6 } 7 } 8 9 doAdd(10); //20 10 doAdd(30, 20); //50arguments還可以和命名過的參數(shù)一起用:
1 function doAdd(num1, num2) { 2 if(arguments.length == 1) { 3 alert(num1 + 10); 4 } else if (arguments.length == 2) { 5 alert(arguments[0] + num2); 6 } 7 } 8 doAdd(10); //20 9 doAdd(30, 20); //50arguments的值永遠與對應(yīng)命名參數(shù)的值保持同步:
1 function doAdd(num1, num2) { 2 alert(arguments[0] + num2); 3 } 4 5 doAdd(10, 20); //30 6 doAdd(30, 20); //50 1 function doAdd(num1, num2) { 2 arguments[1] = 10; 3 alert(arguments[0] + num2); 4 } 5 6 doAdd(10, 20); //20 7 doAdd(30, 20); //40每次執(zhí)行doAdd這個函數(shù),都會將第二個參數(shù)重寫(上述例子中是將第二個參數(shù)重新賦值為10)。這是因為,arguments對象中的值會自動反映到對應(yīng)的命名參數(shù),所以修改
arguments[1],也就相當于修改了num2,不過他們倆的內(nèi)存空間是獨立的,值同步。沒有傳遞值的命名參數(shù)將會被賦予undefined,比如:
1 function doAdd(num1, num2) { 2 alert(num2);//undefined 3 } 4 5 doAdd(10); arguments還有一個屬性:callee,它的作用是返回正在被執(zhí)行的function
例如:
1 function argumentsTest (a,b) { 2 alert(arguments.callee);//返回函數(shù)本身 3 } 4 argumentsTest(1,2,3,4);
在使用函數(shù)遞歸調(diào)用時推薦使用arguments.callee代替函數(shù)名本身。
例如:
function count(a){if(a==1){return 1;}return a + arguments.callee(--a);}var mm = count(2);alert(mm); arguments.length返回的是傳遞給函數(shù)的參數(shù)個數(shù),也叫實參;而arguments.callee.length返回的是什么呢?看個例子:
1 function calleeLengthDemo(arg1, arg2) { 2 alert("arguments.length:" +arguments.length);//3 3 alert("arguments.callee.length:" +arguments.callee.length);//2 4 5 } 6 calleeLengthDemo(1,2,3);
由此可以看出arguments.callee.length返回的是函數(shù)定義的參數(shù),即形參。
三、沒有重載
ECMAscript函數(shù)不能實現(xiàn)重載,不能夠定義同樣的函數(shù)然后通過編譯器去根據(jù)不同的參數(shù)執(zhí)行不同的函數(shù)。
例如:1 function addSomeNumber(num1){ 2 return num1 + 100; 3 } 4 5 function addSomeNumber(num2) { 6 return num2 + 200; 7 } 8 9 var result = addSomeNumber(100); //300 10 alert(result); 1 function addSomeNumber(num1){ 2 num1+=100; 3 return num1 + 100; 4 } 5 6 function addSomeNumber(num2) { 7 return num2 + 200; 8 } 9 10 var result = addSomeNumber(100); //300 11 alert(result); 只要函數(shù)名一致(上述例子中的addSomeNumber),ECMAscript就會認為是同一個東西,那么后定義的就會覆蓋先定義的。 對于ECMAscript函數(shù)來說,我自己本沒有參數(shù),你給我什么參數(shù)我就接受什么樣的參數(shù)。 ?
轉(zhuǎn)載于:https://www.cnblogs.com/yxField/p/4224380.html
總結(jié)
以上是生活随笔為你收集整理的从头开始学JavaScript (七)——函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 7/8/8.1 硬盘安装
- 下一篇: Javascript之旅——第四站:pa