函数
// 函数的基本概念
// 什么是函数:
// 实现固定功能的代码块
// 函数是工具,是实现功能的工具
// 函数是通过其中的代码,来实现所谓的功能
// 函数的特点:
// 封装: 将需要的代码,写入到函数中
// 重复: 一个函数可以反复调用
// 调用: 可以在任意需要位置上调用执行代码
// 函数的定义/函数的封装
// 函数的定义/封装 有固定的语法形式
/*
function 函数名称(函数的参数){
函数的代码;
return 内容;
}
function 定义函数/封装 的关键词,作用类似于 关键词var
告诉计算机程序,我正在封装的是一个函数
函数名称 也就是这个函数的名称,之后调用函数时,是通过函数名称来调用函数,并且执行函数
函数的参数 执行函数时,输入给函数的数据信息
函数的代码 定义在{}中的程序,是函数执行时,调用的程序内容
return 函数的返回值;
// 函数的封装/函数的定义
// 函数封装时,程序并没有被执行,只有在函数调用时,程序才会被执行
function fun(){
console.log(123);
}
// 函数的调用和执行
fun();
// 1,定义函数阶段,只是将程序定义在函数内,程序并没有执行
// 是有在调用函数时,封装在函数内部的程序,才会被执行
// 2,函数命名的规范 --- 与变量的命名规范相同
// 规则 : 只能使用 数字,字母,下划线_,美元$
// 不能以数字开头
// 区分大小写
// 规范 : 见名知意
// 驼峰命名法
// 3,所谓的封装,就是将程序,放在 函数的 { } 中,就是函数程序的封装
// 4,函数的调用
// 调用执行执行,必须使用函数的固定语法, 函数名称() 的方式来调用函数
函数的定义方式 // 1,声明方式 // 通过关键词,function 来定义和声明函数
// 封装函数,但是函数不会执行
// 也就是我现在组装好了一个微波炉,但是就放在那儿没有用
function fun1(){
console.log('我是声明方式定义的函数1');
}
// 2,匿名函数 / 赋值方式
// 定义函数时,不定义函数,名称,将函数赋值给一个变量
// 然后通过调用变量名称()的形式来调用函数
var fun2 = function(){
console.log('我是匿名函数,也叫赋值方式,定义的函数');
};
// 调用时,是通过变量名称()来调用函数
// fun2();
// 函数的基本封装步骤
// 1,定义程序来实现功能的需求
// 2,定义函数,将程序放在{}中,封装程序
// 3,定义参数
// 4,定义返回值
// 5,考虑容错机制
// 函数的执行,对于参数是要有要求的,如果参数出现问题
// 要么终止程序的执行,要么对参数进行处理
// 方式1: 使用return来终止函数的执行
// 在switch判断和循环语句中,可以使用break来终止程序
// 在函数中药终止函数的执行,不能使用break
// 需要使用return关键词;
// 方式2: 对数据进行调整
// 6,考虑函数参数的默认值
// 7,给函数定义函数说明
// 代码规范中规定,所有的自定义函数,都要写函数说明
// 每个公司对于函数说明的语法规范都不相同,我们现在先了解一个基本格式
预解析
<script>
// JavaScript的预解释/预解析
// JavaScript 是 弱类型 解释型 的 脚本语言
// JavaScript 是 解释型 计算机语言 在 程序执行之前,会先将定义的程序,预先解释,也就是预先模拟执行一遍
// 会找程序中的关键词 var function 两个关键词
// 先输出
// 如果是没有使用 var 关键词声明的变量,执行结果是会报错
// 如果使用 var 关键词声明的变量,执行结果是 undefined
// 如果是报错,之后的所有程序,都不会执行
// 如果是 undefined 之后程序还可以继续执行
// 实际项目中,会有这样提前使用变量的操作
// 如果不是使用 var 声明的变量,会报错,整个程序就无法进行了
console.log(int);
// 后定义变量
var int = 100;
console.log('我是之后的其他程序');
fun();
function fun(){
console.log(123);
}
// 这个效果,也就是使用var 定义的 变量,可以先调用,结果是undefined,不会报错
// 使用 function 声明的 函数,可以先调用,后执行,能正常调用函数
// 都是JavaScript程序,预解释/预解析的结果
// JavaScript中,预解释/预解析,操作原理
// 预先读取JavaScript中的所有程序内容,找到所有 var 和 function 关键词 来进行预解释和预解析
// 告诉计算机程序,有哪些变量是使用 var 关键词声明
// 如果提前使用 var 声明的变量,告诉计算机程序,这个变量已经存在,只是当前没有赋值,执行结果是undefined,不会报错
// 如果是使用function 声明的函数,告诉计算机程序,这个函数已经存在
// 并且告诉计算机这个函数的内存地址,可以正常调用使用,这个函数
</script>
变量的作用域
<script>
// 变量的作用域
// 什么叫变量的作用域?
// 所谓的变量的作用域,就是变量的使用范围
// 每一个变量都有自己的使用范围
// 就好像 Q币 只能在QQ商城中使用
// 王者荣耀的金币,只能在王者荣耀的商城中使用
// 变量的作用域分为两种
// 1,定义在函数之内的变量
// 包括函数的参数,定义在函数内部的变量,都称为局部作用域变量 / 局部变量
// 只能在函数内容部使用,如果外部想要直接调用,是不行的
// 此时函数中定义的变量,参数a和变量b,都是局部作用域变量
// 只能在函数内部被调用使用
// 函数外部不能直接使用调用
// 只要是在函数外部,调用函数内部的变量,都是报错
function fun1(a){
var b = 100;
console.log(a,b); // 函数内部调用
}
// fun1('北京');
// console.log(a,b); // 函数外部调用,
// 2,定义在函数之外的变量,称为全局作用域变量/全局变量
// 在函数的内部是可以使用,全局作用域变量的,但是是有条件的
var int = 100;
function fun2(){
console.log(int);
}
fun2();
// 总结:
// 在函数外部,不能直接调用函数内部定义的局部作用域变量
// 在函数内部,可以调用函数外部的全局作用域变量,但是是有条件的
// 变量的赋值原则 // 先在当前作用域中找变量,如果有,就对这个变量进行赋值 // 如果当前作用域没有这个变量,去父级作用域找这个变量 // 如果父级也没有这个变量,再去父级找变量 // 如果所有的作用域都没有这个变量 // 赋值语句,升级为定义变量语句,并且定义的是全局作用域变量 // 不会去子级找变量赋值
// 记住一句话: 定义变量,一定要写 var 关键词,不管是局部还是全局
</script>
递归函数
// 什么是递归函数
// 是一种特殊的函数,就是在函数内部,调用函数自己本身
/*
function fun1(){
在函数fun1中调用函数fun1自己本身
fun1()
}
*/
function fun(num){
num--;
if(num >=1){
fun(num);
}
// 将执行的输出,写在递归调用之下
console.log(num);
}
fun(5);
// 总结:
// 1,调用递归函数,一定要有条件,无条件的调用递归函数,会一直执行调用,不会停止
// 2,调用递归函数,进入递归函数,会由外至内执行,结束递归函数,会从内至外执行
// 我们去理解递归,先看递归的终止
// 之后,在理解,其他情况下,是如何调用自己本身
// 每次调用递归函数本身,参数一定是不同的
// 要慎用递归
// 递归执行时会,定义大量的函数,这些函数函数会占用内存空间,消耗程序的执行效率
// 简单的业务逻辑,比价少的计算次数,也就是递归调用次数
// 实际项目中,前端业务,很少使用递归