以下代码段为什么会引发错误?
"use strict";
(function a() {
console.log(typeof a); // function
console.log(a = 0); // error
})();
为什么此代码段不会引发错误?
"use strict";
(function() {
function a() {
console.log(a = 0); // 0
}
return a;
})()();
为什么立即返回该函数会引发错误?
"use strict";
(function() {
return function a() {
console.log(a = 0); // error
};
})()();
函数表达式是否仅在这种情况下发生?为什么不能重新分配他们?
答案 0 :(得分:5)
这是因为命名为FunctionExpressions的行为,这与 FunctionDeclarations 的行为
不同create a named FunctionExpression are的规则:
FunctionExpression:functionBindingIdentifier(FormalParameters){FunctionBody}
- 让范围成为正在运行的执行上下文的LexicalEnvironment。
- 让funcEnv成为NewDeclarativeEnvironment(范围)。
- 让envRec成为funcEnv的EnvironmentRecord。
- 将其命名为BindingIdentifier的StringValue。
- 执行envRec.CreateImmutableBinding(name,false)。
- 让闭包成为FunctionCreate(Normal,FormalParameters,FunctionBody,funcEnv)。
- 执行MakeConstructor(关闭)。
- 执行SetFunctionName(闭包,名称)。
- 将闭包设置为[[SourceText]]为与FunctionExpression匹配的源文本。
- 执行envRec.InitializeBinding(名称,闭包)。
- 返回闭包。
重点是 .5 ,它确实使函数的名称成为immutable binding。
在第一种情况下,您尝试重新分配此不可变绑定。 抛出
在第二种情况下,您命名的函数不是 FunctionExpression ,而是 FunctionDeclaration ,它具有different behavior。
在最后一种情况下,它是 FunctionExpression ,在这方面与第一个相同。