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中的对象