例程 => 子例程 编译器 调用call
- c语言没有设计函数的关键字, js 是function, 函数体就是一个语句区块
function f(a = 1, ...rest) { // 参数默认值,如果传undefined(不传也是undefined)会采用默认值, 动态参数
}
function f() {
return 1 + 1
}
function g(n) {
return n + 1
}
g(f()) // 3
g(a = 1 + f()) // 4
g(1 + 1) // 3
每当函数被调用时都会创建一个活跃对象, 是个隐藏的数据结构,包含了函数在执行时所必需的信息和绑定,以及返回值地址等…
活跃对象包括
- 对应函数对象的引用
- 调用者对应的活跃对象,用于return之后的控制权转义
- 调用完毕后用于继续执行后续逻辑的恢复信息,通常是一个将在函数调用完毕之后立即执行的指令的地址
- 函数对应的形参,从实参初始化而来;
- 函数中的变量, 以undefined进行初始化
- 函数用于计算复杂表达式的临时变量
- this()
理想状态下函数对象应该是不可变对象
当函数对象被创建的时候,这个函数对应的活跃对象就被激活了 // … 不是说函数调用的时候创建活跃对象吗, 这就激活了?
垃圾回收机制? 根据引用的数量决定的…
离开了闭包, js就没有了灵魂,只是一个由"还不错的设计初心""一堆设计事物"和"类"堆砌而成的空架子
这一章总共三页左右, 这…干货太少了, 很多不知所云, 啥活跃对象…
13-章生成器
- 作者不建议使用生成器
function* fn() {
let count = 0
while (true) {
count++
yield count
}
}
const g = fn()
console.log(g.next().value) // 1
console.log(g.next().value) // 2
console.log(g.next().value) // 3
又说