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