一、作用域
一般来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的 作用域 。
作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
1. 变量的作用域
在 JS 中根据作用域的不同,变量可以分为全局变量、局部变量、块级变量:
变量有一个特殊情况,如果函数内部或者块级作用域内部的变量没有声明,直接赋值,也当全局变量看,但是不推荐。
函数内部的形参可以看作是局部变量。
示例:
2. 变量访问原则
只要是代码就会有至少一个作用域。
如果写在函数内部的局部作用域中还有函数,那么在这个作用域中就又可以产生一个作用域。
根据在内部函数中可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为 作用域链 。
作用域链采取 就近原则 的方式来查找变量的最终值:
<script>
let num = 15
function getName() {
let num = 20
function fun() {
console.log(num)
}
fun()
}
getName()
</script>
二、匿名函数
函数可以分为:
- 具名函数 :function fn(){}
- 匿名函数 :function(){}
1. 匿名函数的使用
将匿名函数赋值给一个变量,并且通过变量名称进行调用,我们将其称为 函数表达式
语法:
调用:fn()
函数表达式的形参和实参的使用方式与具名函数的一致:
<script>
let name = function () {
console.log('张三')
}
name()
</script>
<script>
let name = function (num1, num2) {
console.log(num1 + num2)
}
name(3, 9)
</script>
2. 立即执行函数
立即执行函数可以避免全局变量之间的污染,语法:
立即执行函数如其名,不需要调用,立即执行。
多个立即执行函数之间用 分号(;) 隔开,不然会报错
分号一般写在函数开头,防止前面还有其它立即执行函数
<script>
;(function () {
let num = 18
console.log(num)
})()
;(function () {
let num = 20
console.log(num)
}())
</script>
<script>
;(function (num1, num2) {
console.log(num1 + num2)
})(3, 5)
</script>
时间转换实例:输入秒数,自动转换为时分秒
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let mins = +prompt('请输入秒数:')
function getTime(mins) {
let hour = parseInt(mins / 60 / 60)
let min = parseInt((mins / 60) % 60)
let second = parseInt(mins % 60)
hour = hour > 10 ? hour : '0' + hour
min = min > 10 ? min : '0' + min
second = second > 10 ? second : '0' + second
document.write(`${hour}小时 ${min}分钟 ${second}秒`)
}
getTime(mins)
</script>
</body>
</html>