函数中的作用域
隐藏内部实现
为什么不将所有的变量和函数都放在全局作用域中?
规避冲突
- 隐藏作用域中的变量和函数可以避免同名标识符之间的冲突。
全局命名空间
- 很多第三方库为了防止变量冲突,通常会为变量命名一个非常独特的名字。
模块管理
函数作用域
- 立即执行函数是一种既不需要函数名同时能够自动执行的函数。
匿名和具名
- 区分匿名函数表达式和函数声明:函数声明需要函数名,但是函数表达式则不需要。
- 匿名函数表达式有以下几个缺点:
- 匿名函数在栈追踪中没有名字,会使得调试困难。
- 没有函数名,如果需要递归时,只能使用已经过期的arguments.callee引用。
- 匿名函数降低了代码的可读性。
立即执行函数表达式
- 立即执行函数的英文缩写:IIFE
- 立即执行函数传递参数
倒置代码的运行顺序:window才是真正的参数
块作用域
- 分清定义在块级作用域内还是块级作用域之外
with关键字可以形成一个块作用域
try/catch
- catch中的参数会形成一个块级作用域
- 但是如果在catch内部进行var声明,依然是声明在全局作用域中
let关键字
- let关键字会形成一个隐式的块级作用域,这个隐式是相对于下面的显式而言的。
垃圾收集
- 通过块级作用域,可以让引擎清楚的知道没有必要保存已经用不到的变量了。
const关键字
- const同样可以用来创建块级作用域,但是块级作用域的值是固定的,但是如果存放的是引用地址的话,地址不能变,但是地址指向的值是可以修改的。
小结