函数的返回值
1、在函数内部有return关键字,并且在关键字后面有内容,这个内容被返回了
2、当函数调用之后,需要这个返回值,那么就定义变量接收这个返回值即可
3、函数没有返回值,但在调用的时候接收了,结果就是undefined
4、变量声明了,但没有赋值,结果也是undefined
5、如果一个函数中有return,那么这个函数就有返回值;如果一个函数中没有return,那么这个函数中就没有返回值
6、return下面的代码是不会执行的

function getSum(x, y){
	return x + y;	//把和返回
}
//调用函数
var result = getSum(10, 20);
console,log(result + 10);


//函数调用
function f1(){
	console.log("库尼奇瓦");
	return 100;
}
//f1函数调用,同时又把函数的返回值输出了
console.log(f1());	//"库尼奇瓦" "100"
console.log(f1);	//输出的是f1函数名字----是f1函数的代码


//判断一个数是不是质数(素数)
function isPrimeNumber(num){
	for(var i = 2; i < num; i++){
		if(num % i == 0){
			//说明有一个数字整除了,没必要向后继续整除,此时已经验证出不是质数.
			//return后的代码不执行
			return false;
		}
	}
	return true;
}
console,log(isPrimeNumber(4) ? "是素数" : "不是素数");
//var temp = isPrimeNumber(4);
//if(temp){
//	console.log("是素数");
//}else{
//	console.log("不是素数");
//}

需要返回多个值的时候,可以返回数组

//求一个数组中最大值最小值还有和
/**
 * @param {Object} array给我一个数组,返回一个数组(最大值,最小值,和)
 */
function getArrayMaxAndMinAndSum(array){
	var max = array[0];//最大值
	var min = array[0];//最小值
	var sum = 0;//和
	for(var i = 0; i < array.length; i++){
		sum += i;
		if(max < array[i]){
			max = array[i];
		}//end if
		if(min > array[i]){
			min = array[i];
		}//end if
	}//end for
	var arr = [max, min, sum];
	return arr;
}
//测试
var resultArray = getArrayMaxAndMinAndSum([1,2,3,4,5]);
console.log("最大值:" + resultArray[0]);
console.log("最小值:" + resultArray[1]);
console.log("和:" + resultArray[2]);

函数里面可以调用函数

//输入年月日,获取这个日期是这一年的第多少天

//年---月---日:2019年3月10日
function getDays(year, month, day){
	//定义变量储存对应的天数
	var days = day;
	//如果是1月份则,就没必要计算后面的天数,直接返回天数
	if(month == 1){
		return days;
	}
	
	//函数执行到这一步,说明用户输入的月份不是1月份
	//定义一个数组,储存每个月的天数
	var months = [31,28,31,30,31,30,31,31,30,31,30,31];
	//只需加上前(输入月份 -1)个月的天数和;
	for(var i = 0; i < month - 1; i++){
		days += months[i];
	}
	
	//判断用户输入的年份是不是闰年,如果是,并且月份 > 2,则+1
	if(isLeapYear(year) && month > 2){
		days++;
	}
	return days;
	
}

//函数判断输入的是否是闰年
function isLeapYear(year){
	return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

//验证
console.log(getDays(2000,2,1));

arguments对象,获取传入的每个参数的值

//定义
function f1(){
	//获取的是函数调用时,传入了几个参数
	//console.log(arguments.length);
	
	//使用arguments对象可以获取传入的每个参数的值
	console.log(arguments);
}
//调用
f1(10,20,30);

函数表达式

/**
 * 函数定义:
 * 1.函数声明----函数定义
 * function 函数名(){
 * 	函数体
 * }
 * 
 * 函数的另一种表达方式:
 * 函数表达式:
 * 把一个函数给一个变量,此时形成了函数表达式
 * var 变量=匿名函数;
 * 例子:
 * var f1 = function(){
 * 	
 * };
 * 调用:
 * f1();
 */
//函数声明
function f1(){
	console.log("哈哈哈哈哈,真开心啊");
}
f1();//注意也是“又是开心的一天呀”,覆盖了“哈哈哈哈哈,真开心啊”
function f1(){
	console.log("又是开心的一天呀");
}
f1();//又是开心的一天呀

//函数表达式
var f1 = function(){
	console.log("哦吼吼吼");
}
f1();//哦吼吼吼
f1 = function(){//注意f1前面没有var!!,重新赋值
	console.log("伊呀呀呀呀呀呀");
}
f1();//伊呀呀呀呀呀呀

//函数的自调用,没有名字,声明的同时调用
//一次性的,只能用一次
(function (){
	console.log("我是函数的自调用啊");
})();//我是函数的自调用啊

(function(){
	console.log("又是一个函数的自调用");
})();//又是一个函数的自调用

回调函数

//任何数据类型都可以作为函数的参数使用
//例如
function f1(x,y){
	console.log(x + y);
}
f1(1,2);//数字类型作为参数使用

function f2(x,y){
	console.log(x+y);
}
f2("哈哈哈","我真棒");//字符串类型作为参数使用
function f3(x){
	console.log(x);
}
f3(true);//布尔类型作为参数使用

//如果一个函数作为参数,那么这个参数(函数)叫回调函数。
//只要一个函数作为参数使用了,那就是回调函数
function f4(fn){
	console.log("你好啊");
	fn();//函数调用--说明fn这个变量中存储的是函数的代码
}
function ff(){
	console.log("撒朗嗨呦");
}
//调用函数f4
f4(ff);//括号里面写ff不带小括号,因为函数名()表示函数调用,输出的是函数ff的返回值

函数可以作为返回值使用

//函数是可以作为返回值使用的
function f1(){
	console.log("f1函数调用了");
	return function(){
		console.log("哼哼");
	}
}
var ff = f1();//调用,ff是函数f1 return后面的代码块
//ff就是一个函数了
ff();