如果有一段代码想要反复使用 可以选择循环结构 循环主要针对的是一段代码在这一刻瞬间执行多少次
如果不定时的情况下 反复执行一段代码 则可以用到函数
函数的作用:
把一段代码用大括号封装起来 起个名字 可以反复调用
函数定义的格式:
function 函数名 (){
函数体代码
}
函数名()
函数不调用,不执行
函数的参数的使用:
函数参数分为形参(形式参数) 和 实参(实际参数)
形参:
函数定义时 定义的参数格式 function 函数名(形参1,形参2,形参3....){}
实参:
函数调用时 需要传入实参 就是用实参给形参赋值
实参和形参数量不匹配时的处理方式:
1 当实参等于形参的数量时 正常使用
2 当参数的数量小于形参时(传少了) 多余的形参的值是undefined
3 当实参数量大于形参时(传多了) 多余的实参不予理会
函数的返回值:
函数的返回值的格式:
function 函数名(){
return 需要返回的结果
}
函数名()
我们函数只是实现某种功能 最终的结果需要返回给函数的调用者
通过retrun实现的
只要函数遇到return就会把后面的结果返回给函数的调用者 函数名()=return后面的值
函数返回值的一些小知识:
1如果函数内部没有return语句 那么函数默认返回undefined
2如果函数内部使用了return 但是后面没有值 那么也是返回undefined
这种情况下 return后面没有值的意义在于:单纯为了结束方法
推荐的做法是要么让函数始终都返回一个值 要么永远都不要返回值
如果函数内部有其他结构语句
那么有可能写多个return
最好是所有的return返回的数据类型是一致的
函数的两种创建方式
函数表达式创建:
show()
function show(){
console.log(‘我是show函数’)
}
变量式函数创建:
demo()
var demo=function(){
console.log(‘我是demo函数’)
}
两种创建函数的区别:第一种可以提前调用 第二种不可以
变量的作用域
所谓的变量的作用域指的就是变量的生效范围
js变量按照声明的位置的不同分为全局变量和局部变量
全局作用域:
变量在函数外 不属于任何一个函数的变量就是全局变量 整个js代码都可使用
全局变量的声明周期:
页面加载时创建 页面关闭时销毁 声明周期较长 容易造成空占内存
还会产生命名冲突(全局污染)
局部作用域:
变量在函数内创建 就是局部变量 局部只能在当前函数内使用
局部变量的生命周期:
函数调用时变量创建 函数调用完毕时变量销毁
参数也是局部变量 不同的函数 可以使用相同的参数的名字
隐式全局变量:
隐式全局变量 系统自动帮助我们创建a变量(不推荐使用)
变量和函数提升:
js代码并不是页面加载时就完全的从第一行开始逐行执行并解析
而是在开始执行之前 进行预解析阶段
在预解析阶段 把使用var和function创建的变量进行提升 目的是为了更方便使用数据
变量提升规则:
预解析阶段会把var声明的变量进行提升 提升到对应作用域的第一行
变量值提升变量名 不提升赋值
变量提前调用 值为undefined
(全局变量提升到群居第一行 局部变量提升到局部第一行)
函数提升规则:
预解析阶段会把function声明的函数 进行提升 提升到当前作用域的第一行 函数提升会提升整个函数 函数的调用不提升
匿名函数:
不带函数名字 只有函数声明
function(){}
意义:作为值存在 给其他变量赋值或者作为参数和返回值i使用
函数也是数据类型(算是引用数据类型的一种)
递归函数:
是函数自己调用自己
如果没有限定条件 会导致浏览器卡死
所以递归必不可少的就是结束的条件
回调函数:
函数作为参数传给另一个函数
在另一个函数内部 接受到函数的回调函数本身
然后另一个函数内执行这个回调函数的使用