为什么有时候不能修改 JavaScript 函数变量?

3
我遇到了一个奇怪的问题,就是在某些情况下,JS中的函数变量不可写。
function a(){
  a=1
  console.log(a)
}
a() // output 1



(function a(){
  a=1
  console.log(a)
})() // output a function 'a'



var b=function a(){
  a=1
  console.log(a)
}
b()  // output is also a function 'a'

1
是的,当你试图滥用编程语言时,事情会变得奇怪:p 我没有答案,但有一个问题——为什么你会想要这样做呢? - Jaromanda X
3
嗯,我认为每件事情都应该能够解释清楚,无论是因为漏洞还是设计如此。我只是想让它有意义。 - laishere
1个回答

4

您所遇到的情况涉及函数表达式(标识符不可变)和函数声明(标识符可变)中标识符/名称的不可变性/可变性。

在您的第一个示例中,存在一个带有标识符a可变)的函数声明,因此您正在覆盖该方法,并且输出结果是该覆盖的结果:

function a()
{
    console.log("Without overwrite:", a);
    a = 1; // The identifier `a` is mutable!
    console.log("After overwrite:", a);
}

a();
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

在第二个和第三个示例中,你使用的是函数表达式,其中标识符a不可变的(即只读)。因此,你无法更改它,控制台输出的是函数定义。

(function a()
{
    a = 1; // The identifier `a` is not mutable!
    console.log(a);
})();

var b = function aa()
{
    aa = 1; // The identifier `aa` is not mutable!
    console.log(aa);
}

b();
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}


1
如果我还没有因为正确性投票支持这个答案,那我会因为重新设计控制台而投票支持它。 - Tyler Roper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接