关于函数的基础知识以及一些案例的总结
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script>
//函数
// 概念:由一堆代码组成,实现一些特定的功能,通过函数自身和一些事件实现
//函数的创建
// 1,声明式
// function fn(){}
// function:声明函数的关键字
// fn:函数名
// ():存放函数的形参
// {}函数体,函数的执行语句
// fn() 函数的执行
// 难点:回调函数
// function fn(a){
// console.log(a);
// a(function(c){
// console.log("hello")
// c();
// })
// }
// fn(function(b){
// console.log(b);
// b(function(){
// console.log("脑袋疼")
// })
// })
// fn()将function(b){console.log(b)}作为实参传给了函数fn 此时(a)接受到的相当于a=function.log(b){console.log(b)}
// 这就相当于一个新的函数a;此时执行a()相当于执行函数a,如果实参a()里面还是一个新的函数,那个就相当于创建了一个新的函数b,就是b=function(c){console.log("hello")}
// 这样子执行b()执行了函数b 得到了hello的值
// 函数的实参与形参的关系
// 1,实参与形参之间一一对应
// 2,当实参多余形参时,实参存放在arguments中
// 3,当形参多余实参时,多余的形参为underfind,因为这些形参声明了但未经过实参的赋值
// arguments的用法:
// 定义:arguments是函数中的一个数组,专门用来存放函数中的实参,只有在函数中才能获取
// demo:
// 1.任意个数字的和
// function fn(){
// var sum=0;
// for(var i=0;i<arguments.length;i++){ //注意:这里的i代表的不是数组,而是由arguments 数组的序列号 由0 开始到arguments.length-1;
// sum+=arguments[i]
// }
// console.log(sum);
// }
// fn(3,2,34,36,242);
// demo:
// 1.让三个不同大小的数字,按照由大到小的顺序依次打印出
// function fn(a,b,c){
// if(a>b&&a>c){
// if(b>c){
// console.log(a,b,c);
// }else{
// console.log(a,c,b);
// }
// }else if(b>a&&b>c){
// if(a>c){
// console.log(b,a,c);
// }else{
// console.log(b,c,a);
// }
// }else if(c>a&&c>b){
// if(a>b){
// console.log(c,a,b);
// }else{
// console.log(c,b,a);
// }
// }
// }
// fn(7,4,6)
// 作用域:变量生效的区域
// 作用域的分类:
// 全局:整个代码的区域
// 局部:一个函数就是一个局部
// 全局作用域下的变量叫做全局变量
// 局部作用域下的变量叫做局部变量
// 函数的形参也是一个变量,函数是一个局部作用域,所以形参是一个局部变量
// 变量的生命周期:
// 全局变量:一直存在,随时可以被取用
// 局部变量:随着函数的运行开始而开始,函数的结束而结束
// 提升:
// 1,变量的提升;使用var声明的变量,会提升到当前作用域开始的位置,被声明,在原位赋值
// 2,函数的提升:只要使用function声明的函数,都会整体提升,在当前作用域内都可以被使用
// 但是使用赋值式创建的函数,提升的是声明,而不是函数
// 当函数名与变量同名时,变量会在函数上面的位置,导致函数生效;
function fn(){
console.log(a); //f2
var a = "hello";
console.log(a); //"hello"
function a(){1}
console.log(a); //"hello"
a = "world";
console.log(a); //"world"
function a(){2}
console.log(a); //"world"
}
// 以上的式子相当于
// function fn(){
// var a;
// function a(){1}
// function a(){2}
// console.log(a); //f2
// a = "hello";
// console.log(a); //"hello"
// console.log(a); //"hello"
// a = "world";
// console.log(a); //"world"
// console.log(a); //"world"
// }
// fn();
// 重点!!函数的递归:
// 递归实质上就是一个死循环,重要的是他的停止条件,这时就需要return来帮助函数终止运行
// demo:
// 1.计算5的阶乘
// function fn(n){
// if(n==1){
// return 1;
// }else{
// return n*fn(n-1);
// }
// }
// console.log(fn(3));
// 2.用递归计算1,1,2,3,5,8,13....
// function fn(n){
// if(n==1||n==2){
// return 1;
// }else{
// return fn(n-2)+fn(n-1);
// }
// }
// console.log(fn(3));
// 3.求一个数的最大公约数
// function fn(m,n){
// var r=m%n;
// m=n;
// n=r;
// if(r==0){
// return m;
// }else{
// return fn(m,n);
// }
// }
// console.log(fn(24,6));
// 递归的总结,递归是一个递和归的过程,在归的过程中,判断递的条件,不成立的话将fn(m,n)再进入到函数中
// 执行一次;
// 递归实质上就是一个死循环
// 递归的样式如下
// function fn(){
// fn();
// }
// fn();
// 所以说,让递归停止的条件很重要
// 构造函数:
// 构造函数是一种函数的存储方式
// 数据的存储方式:
// 1,字面量 var a=123;
// 2,构造函数,var b=new Number(123);
// 重点 对象:对象是对事物的描述
// 对象的作用是存储数据
// 对象的实质就是键值对(属性:属性值)
// 键值对之间用,隔开
// 对象中的属性叫做属性
// 对象中的函数叫做方法名
// 语法:对象.属性(方法名)
</script>
</html>