如果名称包含在FunctionExpression中,则该名称将成为一个只读绑定,它会隐藏任何同名的外部声明。但是该绑定本身可能会被函数中的形式参数或局部声明所掩盖。函数名称的这种绑定只为命名的FunctionExpressions而不是为匿名FunctionExpressions或 FunctionDeclarations创建。FunctionDeclaration的名称绑定是在周围的 VariableEnvironment 中创建的。
这是参考 ES5.1 规范的更详细的解释:
与功能对象关联的环境记录不止一个。每当调用一个函数时,都会创建一个新的 DeclarativeEnvironmentRecord 以包含该特定函数调用的本地绑定。该记录成为为该调用创建的 ExecutionContext 的 VariableEnvironment 和初始 LexicalEnvironment。这在第 10.4.3 节中有详细说明。
创建此环境记录时,其“外部环境”设置为正在调用的函数对象的 [[Scope]] 内部属性的值。(第 5 行,10.4.3)外部环境为所有非本地声明提供绑定。[[Scope]] 在创建函数对象时设置(参见第 13 节和第 13.2 节中的语义)。因此,特定函数对象的每个不同调用都有不同的本地环境,但该函数的所有调用共享相同的外部 [[Scope]]。
对于大多数函数,捕获的 [[Scope]] 只是创建函数时处于活动状态的 ExecutionContext 的 LexicalEnvironment。但是,包含标识符作为函数名称的FunctionExpressions在其 [[Scope]] 链的头部有一个额外的 DeclarativeEnvironmentRecord 插入。(参见第 13 节中第三种算法的步骤 1-3)。
这个额外的环境记录用于捕获 FunctionExpression 中给定的函数名称的绑定。