1.函数的定义
定义函数使用关键字  function
 
1、关键字定义方式:
    
     function 函数名(参数1,参数2...){
          功能//函数体
     }
 
     function showInfo(name,age,hobby){
          alert('大家好,我叫' + name + ',今年' + age + '岁,我喜欢'+hobby);
     }
 
2、字面量定义方式:
     
     var 函数名 = function(参数1,参数2...){
          //函数体
     }
     
     var showInfo = function(name,age,hobby){
          alert('大家好,我叫' + name + ',今年' + age + '岁,我喜欢'+hobby);
     }
     
 
     说明:函数名就是一个变量
 
3、Function构造函数(很少用)
     
     var 函数名 = new Function(参数,函数体);
     
     var showAge = new Function('age','alert(age)');
 
函数有什么用?(理解)
 
将重复的代码放到一个函数中 ,可以做到:  
 
1、减少代码的编写(代码重用)   
 
2、便于修改和控制(维护)      
 
3、需要的时候再使用
 
 
函数的特点
 
1、函数自己无法运行,调用时才会执行函数体内的代码块   
 
2、可以多次使用
 
 
参数(重)
 
1、什么是参数?
   在定义函数的时候,在()里面可以定义一些变量,用于接收调用的时候传过来的数据
 
   函数的()中定义的变量及调用时传入的数据都是参数
 
   参数:
     1、函数的()中定义的变量
     2、调用函数时传入的数据
 
2、为什么要定义参数?
   1、让函数变得更加灵活(实现函数的多功能)
   2、实现函数的作用
 
3、怎么定义参数(形参)?(形式参数)
   1、在函数定义的时候括号里面写的变量
   2、形参可以定义多个
   3、每个形参之间用逗号隔开  ,
   4、形参其实就是个变量(遵循变量规则)
 
   function print(arg1,arg2,arg3...){}
 
4、怎么传入参数(实参)?(实际参数)
   1、调用函数时,写在括号里的值(变量)就称之为  实参
   2、多个实参之间使用逗号隔开
 
参数解读(重)
 
1、形参和实参什么关系?
   a、形参和实参之间是一一对应的关系
   b、如果对应的形参没有传值,那么值是undefined
 
2、javascript函数的参数与大多数其他语言的函数的参数有所不同。函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数。
 
arguments(重)
 
1、函数内部自带的一个对象,形式和数组类似(被Arguments创造出来的)
 
2、存储的是所有的实参(调用功能传入的参数)
 
3、可以使用[]及下标访问arguments中的内容   arguments[0]  访问第一个实参
 
4、可以使用 arguments.length 确定传入实参的个数  (arguments['length'])
 
 
最常用的用途: 判断传入参数的个数(根据参数个数做不同的事情)
1、定义一个加法功能,计算传入的所有数字的和*/
	/*function Sum(){
		var sum=0;
		for(i=0;i<arguments.length;i++){
			sum+=arguments[i];
		}
		alert(sum);
	}
	Sum(3,4)*/
	
/*//2、定义一个功能getMax,传入任意个数字,返回最大值
	function getmax(){
		var max=0;
		for(i=0;i<arguments.length;i++){
			if(arguments[i]<arguments[i+1]){
				max=arguments[i+1];
			}		
		}
		alert(max);
	}
	getmax(2,6,4,20,18,13);*/

//3、定义一个运算功能,参数为(x,y),当传入1个数字时,求x的阶乘,如果传入两个数字,求x的y次方
	function getNam(){
		var num=1;
		if(arguments.length==1){		
			for(var i=1;i<=arguments[0];i++)
			{	num*=i;
				return num;
			}
		}else{
			return Math.pow(arguments[0],arguments[1]);
		}		
	}	
	var a=getNam(3,2);
	console.log(a);  
什么是递归?
 
自己玩自己 
function f(){
     console.log(1);
     f();
}
间接的玩自己
function f1(){
     f2();
}
function f2(){
     f1();
}
 
对于递归而言,最重要的是跳出结构,因为只有跳出结构才可以有结果
 
其实所谓的递归就是化归思想
 
递归调用函数,写一个递归函数,最终还是要转换为自己这个函数
 
递归的思想就是将一个问题转化为一个已解决的问题来实现。
 
注意:递归就是在过程或函数里调用自身;使用递归策略时要注意的几个条件
1、必须有一个明确的递归结束条件,称为递归出口。
2、递归需要有边界条件、递归前进段和递归返回段。
3、当边界条件不满足时,递归前进。当边界条件满足时,递归返回。
 
//求1到一百的和
function fn(n){
     if(n<1)
     {
         return 0; //跳出循环的条件
     }
     return n+fn(n-1);//依次递减的规律
}
var sum=fn(100);
console.log(sum)  
 
变量的声明提升
 
浏览器在执行代码之前,会对所有的声明语句,进行提升(把声明代码提升至该作用域的最前面)然后再按顺序执行代码
 
var n = 10;
function test(){
     console.log(n); //undefined
     var n = 20;
     console.log(n); //20
}
test();

var x = 100;
function test(x){
     x+=100;
}
test(x);//执行完释放
console.log(x); //100变量的声明提升
 
tt='ee';
function  b(){
    function test(){ 
          alert(tt);
         tt='ff';
     }
     test()
}
b()
 
 
 
 
 
var tt='123'
function test(){
     var tt;
     alert(tt);
     tt='ff';
}
test();
 
 
2、tt='ee';
function  b(){
   function test(){
       alert(tt);
       /*var tt='ff';*/
   }
   test()
}
b()
 
 
 
实战
 
1、
     console.log(a);
     var a = 10;
     console.log(a);
 
2、
    console.log(test);
    var test = function(){
        console.log(1);
    }
    function test(){
        console.log(2);
    }
    console.log(test);
 
 
思考1
 
var age = 10;
function test(){
     console.log(age); 
}
test();
 
打印什么?
 
 
思考2
 
var age = 10;
function test(){
     console.log(age); 
     var age = 20;  
     console.log(age); 
}
test();
 
打印什么?
 
 
编写一个函数,计算两个数字的和差积商

function calculator(num1,num2,sign){
     switch(sign){
          case "+" : console.log(num1+num2); break;
          case "-" : console.log(num1-num2); break;
          case "*" : console.log(num1*num2); break;
          case "/" : console.log(num1/num2); break;
     }
}  
编写函数,判断一个字符串的内容是不是纯数字

function isANumber( str ){
     var n = Number(str);
     if( typeof n == "number" && !isNaN(n) ){
          alert("是一个纯数字!");
     } else {
          alert("不是一个纯数字");
     }
}
isANumber("df589");

isNaN();  判断一个变量是否为NaN  是的话返回true   不是的话,返回false//1、编写函数,判断一个字符串的内容是不是纯数字
	function isNumber(str) {
		if(isNaN(Number(str))){
			result.value='非数字'
		}else{
			result.value='纯数字';
		}
	}编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。

function digit(num, k){
    for(var i=1; i<k; i++){
        num /= 10;
    }
    return parseInt(num)%10;
}
console.log(  digit(123456, 8) );  
7、编写一个函数,计算任意两个数字之间所能组成的奇数个数,数字必须是个位数。
//比如:计算0~3之间能组成的奇数是: 01、03、13、21、23、31	
	function fuName(a,b){
		var sum;
		for(i=0;i<=b;i++){
			for(j=0;j<=b;j++){
				if(j%2!=0&&j!=i){					
				sum=i*10+j;
				document.write(sum+" ");
				}
			}		
		}
		
	}
	 fuName(3,5)