JavaScript之函数基础知识

函数的基本概念

命名规则: 多单词组合,首字母小写,后面的单词首字母大写;
函数声明: 使用function关键字来声明,后跟函数名跟函数体。

//基本语法
function functionName(arg0,arg1,arg2,....,argN){
	atatements
}
//函数示例
function sayHi(name,message){
	alert("Hello"+name+","+message);
}

函数调用: 可以通过其函数名来调用。

sayHi("Nicholas","how are you today?");

运行结果:
函数定义、调用的测试结果

函数的返回值: 任何函数任何时候都可以通过return语句后跟要返回的值来实现返回值。

//声明
function sum(num1,num2){
	return num1+num2;
} 
//调用
var result = sum (5,10);

结果:result 为15;

注意:函数在执行完return后会停止并立即退出。因此,位于return语句之外的任何代码都永远不会执行

	function sum(num1,num2){
		return num1+num2;
		alert("Hello World");     //永远不会执行
	}

一个函数中可以包含多个return语句:

function diff(num1,num2){
	if(num1<num2){
		return num2-num1;
	}
	else{
		return num1-num2;
	}
}

return语句可以不带有任何返回值: 函数在停止执行后,将返回undefined值。这种用法一般在需要提前停止函数执行而又不需要返回值的情况下。

函数中的参数

函数定义的参数个数同函数调用时传递的参数个数可以不一致,对于参数的数据类型也没有要求;之所以会这样是因为ECMAscript中的参数在内部是用数组来表示的,函数接受到的始终是这个数组,而不关心数组中包含了哪些参数。
其实,arguments对象只是与数组类似(它并不是Array实例),可以使用[]来访问它的每一个元素,使用length属性来确定传递进来了几个参数。
之前的函数也可以改写为,即不显式地使用命名参数:

	function sayHi(){
	alert("Hello" + arguments[0] + "," + arguments[1]);
	}

这个重写后的函数中不包含命名的参数,虽然没有name和message标识符,但函数的功能依旧。这个事实说明了ECMAscript函数的一个重要特点:命名参数只提供便利,但不是必需的。
通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。

function howManyArgs(){
	alert(arguments.length);
}
howManyArgs("Strings",45);    //2
howManyArgs();                //0
howManyArgs(12);              //1

可以利用这一点,让函数能够接受任意个参数并实现适当的功能。

function doAdd(){
	if(arguments.length == 1){
		alert(argument[0] + 10);
	}else if(arguments.lengtn == 2){
		alert(arguments[0] + arguments[1]);
	}
}
doAdd(10);       //20
doAdd(30,20);    //50

arguments可以和命名参数一起使用:

function doAdd(num1,num2){
	if(arguments == 1){
		alert(num1 + 10);
	}else(arguments == 2){
		alert(arguments[0] + num2);
	}  

在本例中,arguments[0]与num1的值相同,arguments[1]与num2的值相同。
arguments的值永远与对应命名参数的值保持同步:

function doAdd(num1,num2){
	arguments[1]=10;
	alert(arguments[0]+num2);
}
//执行
doAdd(100,200);

结果为 110
每次执行这个doAdd()函数都会重写第二个参数,将第二个参数的值修改为10。因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1],也就是修改num2,结果他们的值都变成10。这并不是说读取这两个值会访问相同的命名空间;它们的内存空间值独立的,但它们的值会同步。但这种影响是单向的:修改命名参数不会改变arguments中对应的值。另外还要记住,如果只传了一个参数,那么为arguments[1]设置的值不会反应到命名参数中。这是因为arguments对象的长度是由传入的参数个数决定的,不是由定义函数时命名参数的个数决定的。
关于参数还要记住最后一点:没有传递的命名参数将自动赋予undefined值。这就跟定义了变量又没有初始化一样。
严格模式下,重写arguments的值会造成语法错误。

没有重载

ECMAscript函数不能像传统意义上那样实现重载。
而在其他语言中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数类型和数量)不同即可。
如果在ECMAscript中定义两个相同的函数,那么后定义的函数会覆盖先定义的函数。

一些小栗子

1、定义一组函数,输入数字,逆转并输出汉字形式

	var str='';
	function reserve(){
		var num = window.prompt('请输入需要转换的数值:');
		for(var i=num.length-1;i>=0;i--){
			str+=transfer(num[i]);
		}
		document.write(str);
	}
	function transfer(target){
		switch(target){
			case "0":
				return "零";	
			case "1":
				return "壹";	
			case "2":
				return "贰";	
			case "3":
				return "叁";
			case "4":
				return "肆";
			case "5":
				return "伍";	
			case "6":
				return "六";		
			case "7":
				return "柒";	
			case "8":
				return "八";	
			case "9":
				return "玖";
			}
		}
		//调用函数
		reserve();

运行结果:
测试数据
测试结果:玖八柒六伍肆叁贰壹
2、写一个函数,实现n的阶乘(递归)

function jc(n){
	if(n==1){
		return 1;
	}
	return n*jc(n-1);
}

3、写一个函数,实现斐波那qi数列

function fb(n){
	if(n==1 || n==2){
		return 1;
	}
	return fb(n-1)+fb(n-2);
}

4、挑战题:要求输入一串低于10位的数字,输出这串数字的中文大写。
例如:输入:10000输出:壹万
输入:1001010输出:壹佰万壹仟零壹拾

猜你喜欢

转载自blog.csdn.net/mirror_Mx/article/details/85112689