「注解」《你不知道的JavaScript(上卷)》第三章:函数作用域和块作用域

·  阅读 373

函数中的作用域

隐藏内部实现

  • 为什么不将所有的变量和函数都放在全局作用域中?

规避冲突

  • 隐藏作用域中的变量和函数可以避免同名标识符之间的冲突。

全局命名空间

  • 很多第三方库为了防止变量冲突,通常会为变量命名一个非常独特的名字。

模块管理

函数作用域

  • 立即执行函数是一种既不需要函数名同时能够自动执行的函数。

匿名和具名

  • 区分匿名函数表达式和函数声明:函数声明需要函数名,但是函数表达式则不需要。
  • 匿名函数表达式有以下几个缺点:
  1. 匿名函数在栈追踪中没有名字,会使得调试困难。
  2. 没有函数名,如果需要递归时,只能使用已经过期的arguments.callee引用。
  3. 匿名函数降低了代码的可读性。

立即执行函数表达式

  • 立即执行函数的英文缩写:IIFE
  • 立即执行函数传递参数
  • 倒置代码的运行顺序:window才是真正的参数

块作用域

  • 分清定义在块级作用域内还是块级作用域之外

with关键字可以形成一个块作用域

try/catch

  • catch中的参数会形成一个块级作用域
  • 但是如果在catch内部进行var声明,依然是声明在全局作用域中

let关键字

  • let关键字会形成一个隐式的块级作用域,这个隐式是相对于下面的显式而言的。
  • let声明的变量不会在块作用域中进行提升。

垃圾收集

  • 通过块级作用域,可以让引擎清楚的知道没有必要保存已经用不到的变量了。

const关键字

  • const同样可以用来创建块级作用域,但是块级作用域的值是固定的,但是如果存放的是引用地址的话,地址不能变,但是地址指向的值是可以修改的。

小结

分类:
前端
标签: