今天在群里看到有人问了个问题,好奇就试了一下。
var test=1;
(function test(){
test=2;
console.log(test);//[Function: test]
})();
打印的是"[Function: test]"
那么test函数内对test的赋值操作的对象是哪个呢?外部test变量还是该函数名?
var test=1,test2=2;
(function test(){
test=2;
test2=3;
console.log(test);//[Function: test]
})();
console.log(test,test2);//1 3
可见,该赋值操作的对象很可能并非外部变量,而是内部函数名。只不过修改失效了。
以上是在具名的立即执行函数内部的实验。
再试试其他情况:在普通函数内部修改函数名的值呢?
function a(){
console.log(a);//[Function: a]
a=1;
console.log(a);//1
}
a();
修改成功了。(注意!后续再调用a()会报错)
所以是真的可以在具名函数内部修改函数名。
为了形成鲜明对比,在上面代码中加括号,使得a成为具名的立即执行函数,结果如下:
(function a(){
console.log(a);//[Function: a]
a=2;
console.log(a);//[Function: a]
})();
修改不成功。
这一点是真的没发现过,还挺好玩~