22函数 作用域 预解析
一、函数的返回值
return语句,用于向函数调用者返回一个值,并立即结束函数的运行
如果要实现外部获取函数内部运行的结果,可以通过return语句跟后面的要返回的值来实现返回值
如果没有使用return语句直接调用函数内部的值,运行会弹出undefined
利用return输出两个不相同的数中最大的值
function getMax(a, b) {
var max
if (a > b) {
max = a
} else {
max = b
}
return max
}
console.log(getMax(10,20)) //20
利用return简化获取元素的代码
<box id = "box"></box>
function getId(id){
var id = document.getElementById(id)
return id
}
var box = getId("box")
console.log(box) //<box id = "box"></box>
二、作用域
作用域
变量早函数内部作用的范围/区域。有函数的地方就有作用域
全局作用域和局部作用域
全局变量:可以在函数内部和函数外部使用的变量,就是"全局变量"。
在函数外部定义的变量,就是"全局变量"。
"全局变量"即可以在函数外使用,也可以在函数内部使用。
"全局变量"在网页关闭时,自动消失(释放空间)。
总结:在函数外部定义的变量,就是全局作用域
局部变量:只能在函数内部使用的变量,称为"局部变量"。
"局部变量"在函数内部定义,在函数内使用。
"局部变量"在函数外部无法访问。
"局部变量"在函数执行完毕就消失了。
总结:在函数内部定义的变量,就是局部作用域
在函数内部,省略关键字var定义的变量是"全局变量"。
注意:var关键字尽量别省略,省略后"全局变量"和"局部变量"容易搞混淆。
定义变量都使用var
作用域链
- 全局作用域称之为0级作用域
- 定义函数开启的作用域就是1级 -2级 -3级...作用域
- JavaScript会将这些作用域链接在一起形成一个链条,这个链条就是作用域链0-1-2-3-
变量在作用域查找规则
- 先在当前域找,找到就使用当前作用域找到的
- 如果当前作用域中没有找到,就去上一级作用域中查找
- 以此类推直到0级为止,如果0级作用域还没找到,就报告错
变量的生命周期
- JavaScript变量生命周期在它声明时初始化
- 局部变量在函数执行完毕后销毁
- 全局变量在页面关闭后销毁
主要是为了减少内存占用,提高性能
三、预解析
预解析
浏览器在执行JS代码的时候会分成两部分操作:预解析以及逐行执行代码。也就是说浏览器不会直接执行代码,而是加工处理之后再执行,这个加工处理的过程,我们就称之为预解析
预解析规则
变量提升
- 将变量声明和函数声明提升到当前作用域最前面
- 将剩余代码按着书写顺序依次放到后面
预解析补充
把一个函数赋值给变量(var声明的),函数声明不会提升
注意
在函数内声明的变量如果没用使用var声明,那么这个变量不是局部变量而是一个全局变量,这是一个js的bug