## 1.函数的定义
函数可以理解为一个盒子 把一段多次使用的复杂代码放在里面
先定义 在调用 必须定义 没有定义的话 后面就不能调用 没有掉用的话 前面定义就毫无意义
## 2.函数的语法
语法 : function () {
}
### 2.1 定义
a.赋值式定义 var a(变量名字) = function (形参) {要多次使用的代码}
b.声明式定义 function 函数名 (形参) {要多次使用的代码}
### 2.2 调用
语法 : 函数名(实参)
### 2.3 两者的区别
赋值式定义 不可以把调用放在定义前面 可以放在后面
声明式定义 可以把声明放在定义前面和后面
*具体是为什么呢?请看下面分析*
### 2.4 变量提升和声明提升(区别的原因)
在浏览器读js代码时 会先预解析 在变量提升
什么又是变量提升呢?
在预解析的时候,js的内部变量会全部提升到当前作用域顶部 换句话就是当前代码的最上面
要注意的是变量提升上去以后 内容便没有跟着上去. 这就导致赋值变量前面的调用不能使用
因为这个时候 变量里面没有赋值 还没有定义 它输出的值是undefined .undefined不能调用
所以会报错
还是不太清楚的可以看例子:
我写的代码:
fn() 调用
var fn = function fn () {
console.log(1) 假如我随便打一个1
}
fn() 调用
浏览器解析的
fn () 不是变量不提升
var fn = function () {
console.log(1) 是变量所以要上去(变量的提升) 注意:内容不会跟着上去
}
fn () 不是变量不提升
提升以后
var fn 未定义 如果要输出会输出undefined
fn () 上面没有定义 所以输出 undefined
fn = function () {
console.log(1) 把函数赋给fn
}
fn () 因为上面已经定义 所以打印1
所以在赋值式定义的时候 调用不能写在定义前面
那为什么声明式函数又可以放在前面呢? (声明提升)
我也分三部分来解释
我写的代码
fn1 调用
function fn1 () { 定义函数
console.log(2)
}
fn1 调用
浏览器解析的
fn1 () 不是声明不提升
function fn1 () { 是声明提升 这里注意是定义的整个函数一起上去
console.log(2)
}
fn1 () 不是声明不提升
提升以后
function fn1 () { 定义函数
console.log(2)
}
fn1() 上面已经定义所以可以调用
fn1() 上面已经定义所以可以调用
### 2.5 参数
前面我提到了参数,但是没有解释 这里我来解释一下
为什么我们要有参数呢?
因为如果没有参数,函数的功能比较单一 不够灵活
参数有:形参(写在定义里面,每个形参相当于一个参数 形参的值是由实参传递过来的)和实参(写在调用里面 按照书写顺序一一对应 传递给形参)
大家可以想一想 如果形参多,实参少 会出现什么情况呢?
function fn2 (a , b , c , d) {
console.log(a , b , c , d)
}
fn2 (100 , 40) 实参里面的数字会传递给形参 但是这里只有两个 所以a=100 b=40 c和d没有值 相当于我只是申请了变量但是没有赋值 就是未定义 所以这个时候会打印出undefined undefined
如果实参多,形参少,又会出现什么情况呢?
function fn3 (a) {
console.log(a)
}
fn3 (11 , 23 , 44) 由于我实参只有一个所以我只会把11传递给a 23 44 没有传递的对象所以不传递
### 2.6 函数参数默认值
function fn4 (a , b = 29 , c = 33) { 把数字直接赋值给形参 这就是它的默认值
console.log(a , b , c) 特点:如果实参没有给值 就是形参的默认值打印出来
如果实参给了 就执行实参的 (实参覆盖了形参的值)
}
fn4(10 , 58)
解析一下我的代码: b的默认值是29 c是33
由于我实参给了10 和58 首先a = 10 b = 58(覆盖了) c
= 33
### 2.7 函数的返回值
每个函数都有一个返回值 默认返回值是undfined 如果定义了就是定义那个
语法 :return 要返回的内容 必须要有空格
特点: 返回就会终止
要接收返回值就要申请一个变量 我们的返回值是返回给形参的
function fn1 () {
console.log(1) 打印1
console.log(2) 打印2
return 6 返回6 停止执行
console.log(3)
}
var a = fn1() 接收返回值
console.log(a) 打印6