WEB-JS-day05

day05

函数和对象

函数

函数分为 系统函数, 和自定义函数


系统函数:
parseInt()/ parseFolat()/ alert()  prompt() /isNaN(数据)


function : 功能体, 函数(方法),可以接受若干个数据,返回处理的结果.
函数的作用:  用于封装反复执行的代码.

1. 创建普通函数

格式:  这个是声明方法(创建函数)
function 函数名称(){
	函数体  ---封装的代码
}


调用函数: 就是执行函数体中的代码.
	函数名称()

创建函数,封装计算1~100 之间所有整数的和,并切打印出现;调用3次.

	function getSum(){
		var sum=0;
		for (var i=1;i<=100 ;i++ ){
			sum +=i;
		}
		console.log(sum);
	}
	
	
	getSum();
	getSum();
	getSum();

2. 创建带有参数的函数

function 函数名称(参数列表){

	函数体;
}

参数列表: 用于接收传递的数据.
创建函数时的参数 叫形参. 调用时的参数称为实参
调用时,实参会赋值给形参,
多个参数之间用逗号隔开, 参数可以有0个或多个,如果形参未被赋值,值为undefined .

练习 计算1~任意数字之间所有整数的和,调用多次

    //创建带有参数的函数

	function add(num1){ //形参
		var sum=0;
		for (var i=1;i<=num1 ;i++ ){
			sum+=i;
		}
		console.log(sum);
	}
	
	//调用时,实参的值会赋给形参.
	add(2); //实参
	add(100);

练习 创建函数,计算任意两个年份之间的闰年的个数并打印出来,调用多次.

	function getCount(n1,n2){
		for (var count=0 ;n1<=n2 ;n1++ ){
			if (n1%4===0 && n1%100!==0 ||n1%400===0){
				count++;
			}
		}
		console.log(count);
	}
	
	getCount(2019,2100);

3. 创建带有返回值的函数 这种形式才是完整的,之前的那种很少用.

格式:
function 函数名称(参数列表){
	函数体;

return 值;// 返回值,就是函数调用后的结果
}


注: 如果函数中没有return ,或者return后 没有加任何的值, 返回undefined.
	

    function getMax(n1,n2){
    	if (n1>n2){
    		return n1;
    	}
    	return n2;
    }
    
    var r=getMax(5,9);
    console.log(r);

作用域

变量或者函数的可访问范围,分为2种

函数作用域: 在函数中使用var声明的变量,只能在函数的内部访问 

全局作用域: 在全局使用 var声明的变量,可以在任意合法位置访问.

注意: 在函数内,不使用 var 声明直接赋值的变量,是全局变量.可以在函数外访问到的.

注: 不声明直接使用的变量是全局变量,
	但是这是不严格的写法,后期不建议这样书写代码

练习:

var c=3;
function fn2(){
	c=5;
	var d=e=4;
	// 等价于一下形式
	// e=4; //全局变量
	// var b=e;// 局部

//注: 不生命直接使用的变量是全局变量,
//	但是这是不严格的写法,后期不建议这样书写代码
}
fn2();
console.log(c);
console.log(d);

变量声明提升

JS程序在执行前,会将使用var声明的变量提升到所在作用域的最前边,
但赋值还是在原位置发生的. 也就是说只会提前声明,并没有值.
如下案例:

    /*
    var a=1;
     console.log(a);
    
    //JS执行前会把 提升声明的变量提升的前面.
    // 赋值还是在原来位置.只会提前声明.所以输出是undefined
    
    console.log(a); //undefined
    var a=1;
    
    
    
    var c=3
    function fn(){
    	// var b;
    	console.log(c);//undefined
    	// 会把 var b; 提升到当前函数的最前面
    	var c=5;
    	
    }
    fn();
    console.log(c);//3
    
    */
    
    var d=3;
    function fn(){
    	console.log(d);// 3
    	d=8;
    	console.log(d);// 8
    }
    fn();

形参是一个局部变量,不能被外部访问

function fun(n){

	console.log(n);//2

}
fun(2);
// 无法访问形参 n 形参是一个局部变量
console.log(n);// 报错


var m=7;
function foo(m){// 形参的m是局部变量
	m=m+3;// 优先使用离得最近的变量
	console.log(m);//8
}
foo(5);
console.log(m); //7

函数作用域

函数的可访问范围,分为全局作用域和函数作用域

在全局作用域创建的函数,可以在任何作用域下调用,
在函数作用域下创建的函数,是一个局部函数,只能在这个函数的内部才可以调用.


    //全局函数,可以在任何的作用域访问
    
    function fn1(){
    	console.log(1);
    
    }
    fn1();
    function fn2(){
    	fn1();
    
    }
    fn2();
    
   
    
    function fn3(){
    	// 在函数作用域下,创建函数fn4,
    	//他的作用域,只在fn3 中才可以调用
    	function fn4(){
    		console.log(222);
    	}
    	fn4();
    }
    fn3();

函数的提升

和变量提升一样,js在执行前,会将使用function 关键字创建的函数提升到所在作用域的最前边. 
在调用的位置执行函数体中的代码.


// 调用函数才会执行函数中的代码
// 和变量提升一样,也会把函数提升到前面.
fn();
function fn(){
	console.log(1);
}

在函数中调用自身,本身是一个死循环 叫递归

死循环无意义, 所以我们在使用递归时,一定要设置一个条件,来结束死循环

用法: 要有结束的条件,结合return. 来结束递归死循环

// 使用页面来演示递归的死循环

var i=1;
function fn(){
	//弹出警示框
	alert('long ago '+i);
	// 想要结束死循环,需要写一个判断条件,
	//使用return来结束方法
	if (i>=3){
		return;
	}
	i++;
	fn();
}
fn();


//练习: 使用递归计算1 -任意数字之间的所有整数的和
var i=1;
function getSum(m){
	//如果 m为1 ,返回1
	if (m===1){
		return 1;
	}
	//其他情况
	return m+getSum(m-1);
	

}
i=getSum(100);
console.log(i);

作业

1. 斐波那契数列 1 1 2 3  5 8  13 ....
	1. 计算第n项的数

    var a,b;
    var num=1;
    for (var i=0;i<5 ;i++ ){
    	if(i===0 ||i===1){
    		a=b=1;
    		num=1;
    		continue;
    	}
    	num=a+b;
    	a=b;
    	b=num;
    }
    
    console.log(num)

function f(n){
	//跳出条件: 当n为1或者2时,结束,返回 1
	if (n===1 || n===2){
		return 1;
}
//当前这一项是前两项的(n-1,n-2)和
	return f(n-1)+f(n-2);

}

console.log(f(5));


2. 预习JS中的对象

你可能感兴趣的:(web)