目录
闭包
概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
简单理解:闭包 = 内层函数 + 外层函数的变量
例:function outer() {
const a = 1
function f() {
console.log(a)
}
}
outer()
一般情况下,函数套函数不会产生闭包,但像这种里层函数使用了外层函数的变量时,会产生闭包
闭包的作用:封闭数据,提供操作,外部也可以访问函数内部的变量
变量提升
变量提升是JavaScript中比较“奇怪”的现象,它允许在变量声明之前即被访问(仅存在于var声明变量)
- 变量在未声明即被访问时会报语法错误
- 变量在var声明之前即被访问,变量的值为undefined
- let/const声明的变量不存在变量提升
- 变量提升出现在相同作用域中
变量提升流程:先把var变量提升到当前作用域最前面,只提升变量声明,不提升变量赋值,然后依次执行代码
函数进阶
函数提升
函数提升与变量提升比较类似,是指函数在声明之前即可被调用
例1:
foo()
function foo() {
console.log(‘函数声明之前即被调用’)
}
例2:
bar()
var bar = function() {
console.log(‘函数表达式不存在提升现象’)
}
- 函数提升能够使函数的声明调用更灵活
- 函数表达式不存在提升的现象
- 函数提升出现在相同作用域中
函数参数
动态参数
arguments是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参
当不确定用户传入多少实参时可以使用
例:function getSum() {
let sum = 0
for(let i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
console.log(sum)
}
getSum(2,3,4)
getSum(2,3,4,5,6)
总结:
- arguments是一个伪数组,只存在于函数中
- arguments的作用是动态获取函数的实参
- 可以通过for循环依次得到传递过来的实参
剩余参数
剩余参数允许我们将一个不定数量的参数表示为一个数组
例:function config(a,...other) {
console.log(a) // 得到‘http://baidu.com’
console.log(other) // 得到[‘get’,‘json’]
}
config(‘http://baidu.com’,‘get’,‘json’)
...是语法符号,置于最末函数形参之前,用于获取多余的实参
借助...获取的剩余实参,是个真数组