1.函数介绍
1. JS函数的概念 函数就是把特定功能的代码抽取出来,使之成为程序中的一个独立实体。
2. 函数的作用 正如函数的概念, 我们可以根据需要, 将特定的功能用函数来包裹(封装)
3. 使用函数的好处
1, 函数可以在同一个程序或其他程序中多次重复使用(通过函数名调用)
2, 使程序变得更简短而清晰 , 提高可读性
3, 有利于程序维护
5.函数不调用自己不执行
6.调用函数的时候千万不要忘记加小括号
2.函数分类
函数的分类
函数可以分为: 系统函数 内置函数 和 自定义函数
系统函数,内置函数:
是官方提供好的函数,可以直接使用 如: alert(), isNaN(), console.log() ,document.write(), Boolean(), Math.pow()等
alert(): 它的中文意思是“提醒”。它是JavaScript或VBscript脚本语言中窗口window对象的一个常用方法;其主要用法就是在你自己定义了一定的函数以后,通过执行相应的操作,所弹出对话框的语言。并且alert对话框通常用于一些对用户的提示信息。常见的为alert函数。
isNaN(): 通过Number方法把参数转换成数字类型,若转换成功,则返回false,反之返回true,注意它只是判断参数是否能转成数字,不能用来判断是否严格等于NaN。
console.log(): 类似于alert啊,不过不会打断操作。主要是方便调式javascript用的。你可以看到你在页面中输出的内容,不过需要浏览器支持控制台输出。在浏览器界面使用快捷键 F12 就能打开控制台,这个F12 最确切的叫法是开发人员工具。其中,Console 即控制台。点击右键的 Clear console 菜单 或者 输入 clear() /console.clear()然后按回车即可清空控制台内容。
document.write():打开一个新文档,即打开一个流,并擦除当前文档的内容。
alert() 提示框
parseInt() 取整,转至十进制
parseFloat()
toString()
aconfirm('确定要删除吗?')
arguments
1 .位数组
- 用于接受动态的参数
- 只能在函数内部使用
- 可以通过下标取值
- 它有length属性 (length他有多少参数)
var num = confirm('你确定要删除吗') console.log(num);
isNaN:如果是数值,就是false,不是数值。true。
3.函数的参数
- 函数的书写语法
function 函数名称 (行参1,行参2,...){ //逻辑代码 return } //2.使用函数 //函数名称(10,20)//10和20是实参
function num(a,b){ var red = a+b return red } var red2 = num(100,100) console.log(red2); console.log(num(40,500)); console.log(num(50,30));
- 函数的定义和调用
自定义函数:
是用户自己定义的函数, 用户可以根据实际需求, 对特定的功能使用函数来封装
注意:1.函数名后括号()中的参数数量不定,也可以没有;(根据功能需要)
2.return关键字的作用是将某个值返回,如果没有返回值则默认返回undefined(未赋值)
函数中的arguments数组:
js中函数不介意传递进来多少个参数,也不在乎传进来的参数是什么类型,在调用函数时未必一定要传递指定数量的参数。原来是ECMAScipt中的参数在内部是用一个组(argumebts)来表示。函数接收到的始终是个数组,而不关心数组中包含哪些参数(如果有参数的话)。
arguments可以判断参数的个数,arguments是个数组
我们可以使用arguments.length来获取参数的个数
可以使用arguments[i] 的方式来访问数组中的第i个参数(i为自己给定的整数下标)
作用域: 就是起作用的范围。或者说有效范围; 这里涉及到另外两个概念
什么叫做作用域链?
"过程",当函数内部访问一个变量的时候,就先在函数内部查找
如果函数内部没有,就向外部函数查找,外部也没有,就向window上查找
这个查找的过程叫做作用域链
作用域及作用域链
作用域概述
一个变量的作用范围称为作用域,作用域主要分为全局作用域(全局可以),局部作用域(局部可用)
在全局中不能访问局部作用域变量,但是局部可以访问全局
1.全局作用域
2.局部作用域
3.let const 块级作用域
4,eval函数作用域
局部变量: 定义在函数内部的变量,这个变量只能在函数内部使用,即作用域范围只是函数内部,另外,形参也是局部变量.
全局变量: 全局变量就是定义在函数外部的变量,这个变量在任何函数中都有效,即作用域范围是当前文件的任何地方.
当全局变量与局部变量同名同时存在时 ,局部变量优先
注意: 在定义变量时, 如果不写关键字var也是合法的, 且是全局变量, 但是这样写不安全,容易在其他地方被更改, 所以我们在函数中写变量要加上var
4.函数的嵌套
1.函数的嵌套:函数内部可以再包含其他函数;
2.函数之间允许相互调用,也允许外调用,但是不可以调用同级的嵌套函数
5.DOM的简单操作
1, 获取元素节点对象: document.getElementById(‘id’);
2, 获取输入框的内容: value属性
3, 点击事件: onclick
事件驱动:
因为函数不会主动执行, 只有当调用的时候才会执行函数中的代码, 在前面的dom操作示例中,我们点击了按钮才触发函数调用
所有的函数,没有调用不会执行,那么在我们浏览器中函数调用的源头在何处,就是事件, 只有使用事件去驱动, 函数才被调用; 如: onclick: 点击事件
递归调用: 函数可以自己调用自己,必须要有结束条件,称为函数的递归调用;
重要性: 递归的分量,递归属于函数中比较难理解的知识,在应用开发中,虽然使用不是很频繁,但是很体现你的功底,而且,从事IT行业开发,最好要会递归,如果说现在可以不要求灵活运用的话,以后到公司中一定要会,如果面试中有人问你递归,说明,他对你要求挺高
递归调用的方式:
1. 首先去找临界值,即无需计算,获得的值(一般是返回该值)。
2. 找这一次和上一次的关系(一般从后往前找)
<script> function fn (n){ if(n==1){ return 1; } return n + fn(n-1); } console.log(fn(5)); </script>
3.递归常见使用场景
1)循环能做的,递归都能实现(不考虑性能)
2)对象or数组的深拷贝
3)磁盘上文件的遍历
4)管理系统的左侧动态菜单
4. 假设当前函数已经可以使用,调用自身计算上一次的运行结果,再写出这次的运行结果。看上去还是很迷茫, 我们来举个例子:
案例
兔子繁殖问题,设有一只新生兔子,从第四个月开始他们每个月, 月初都生一只兔子, 新生的兔子从第四个月月初开始又每个月生一只兔子按此规律,并假定兔子没有死亡, n(n<=20)个月月末共有多少只兔子?
函数的概念
函数相当于一个代码空间 他里面可以存储一些代码片段,一般我们会将一些代码抽取放入到函数内,这样的操作就是封装。核心就是利用函数来减少余代码的出现,形成对应的复用
函数的定义
function关键词来定义
定义的方式有三种
匿名函数(没有名字的函数 无法复用的)
自执行函数 自己执行 准备工作的执行(框架的封装)
(function(){ console.log("你好") })()
具名函数
function 函数名 (形参){ 函数体 } 函数名()调用 //调用 函数名() saHello() //结合匿名函数来声名具名函数 var sayHi =function(){ console.log("你好"); } sayHi()
函数的执行过程
- 预编译过程
- var关键修饰的变量会预编译
- function也会发生预编译
执行过程
函数声明会发生预编译 调用的时候会发生什么操作
- 他会去寻找对应的堆空间的函数引用
- 然后
函数的参数
没有实际的参数叫做形参 用于定义
有实际值的参数叫实参 用于传递
注意事项
js允许少传参 必须这个没有被使用
arguments的属性及方法
length属性 用于获取对应的传入参数个数
callee方法 指向当前的函数
argumens访问对应的参数使用下标访问
下标从0开始 到 arguments.length-1结束
0表示是第一个=参数 那么5表示第六个参数x表示x+个参数
省略对应的新参 直接传入实参 在函数中使用arguments来接收的对应的实参
举例
传入不定的参数 计算他们之间的和
function sum(){ var rersult = 0 for(var i =0;i<arguments.length;i++){ result+=arguments[i] } return result } console.log(sum(1,2,3,4,5,6))