【发布时间】:2019-11-14 22:07:38
【问题描述】:
为什么后面的sn-p会报错?
"use strict";
(function a() {
console.log(typeof a); // function
console.log(a = 0); // error
})();
为什么这个 sn-p 不抛出错误?
"use strict";
(function() {
function a() {
console.log(a = 0); // 0
}
return a;
})()();
为什么立即返回函数会抛出错误?
"use strict";
(function() {
return function a() {
console.log(a = 0); // error
};
})()();
函数表达式是唯一发生这种情况的情况吗?为什么不能重新分配?
【问题讨论】:
-
在第一个示例中,
a是函数的名称,但它不是环境中的实际绑定。与您执行foo = function bar() {}相同 - 您不能调用bar(),因为该标识符不存在。 -
@VLAZ 但是你可以在第一个例子中在
a中调用a()... -
@deceze 啊,真的。我以某种方式完全误读了第一个示例,因为它试图在它之外重新分配
a... -
为什么第二个例子没有抛出错误:因为它是一个函数声明而不是一个函数表达式。命名函数表达式对于在它们内部使用的名称有奇怪和特殊的规则。函数声明只是其范围内的变量。
-
是的,它是一个命名函数表达式的东西。和
class类内部的东西,现在(class X { constructor() { X = 0; } } new X(); /* fails */ X = 0; /* sets */)。为什么?因为规范是这么说的。
标签: javascript function