为什么有时不能在js中修改函数变量?

时间:2019-04-23 02:14:13

标签: javascript

我遇到了一个奇怪的问题,即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 个答案:

答案 0 :(得分:4)

从此来源:Variable hoisting inside IIFE (lazy parsing)

您正在尝试的情况与function的标识符/名称的不可变性/可变性有关,当它是函数表达式(标识符不可变)时)和功能声明(标识符可变)

在第一个示例中,有一个函数声明,其标识符为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;}