# 第七章 函数表达式

# 函数声明提升:在执行代码之前会先读取函数声明

# 写递归函数时最好声明具名函数, 例如

const factorial = (function f(num) {
 if (num <= 1) {
  return 1;
 } else {
  return num * f(num - 1)
 }
})

以上代码创建了一个名为f()命名函数表达式,然后将它赋值给变量factorial。即使把函数赋值给另一个变量,函数名字f依然有效,所以递归可以正常完成。

# argument.callee 可以代替函数名,但严格模式下不能使用

# 闭包:是指有权访问另一个函数作用域中的变量的函数

# 作用域:函数执行时会生成全局变量对象和函数的活动对象,全局环境的变量对象一直存在,局部环境的变量对象只有再函数执行过程中存在(除闭包外)。在函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量

# 由于闭包会携带包含它的函数的作用域,因此会比其他函数占用过多的内存

# 在全局函数中, this指向window, 而当函数被作为某个对象的方法调用时, this指向这个对象, 匿名函数的执行环境具有全局性, 因此其this对象通常指向window

# 每个函数在被调用时都会自动取得两个特殊变量: this和arguments

# 闭包会引用包含函数的整个活动对象