js函数名的疑惑
程序员文章站
2022-03-31 14:17:28
...
function a(b) { console.log(b) b = function c() { b = 2 c = 3 console.log("b:change",b); console.log("c:",c); } console.log("b:before",b); b(); b(); } a(0)
每一个函数都是Function类型的实例,函数是对象,函数名是一个指向函数对象的指针。此处是一个函数表达式,b=function c(){},对该函数的定义,引用的指针是保存在了b中,c仅仅是为了让函数体能够使用这个名字来引用自身。在b的这个函数体内,c是作为不可重写的local变量使用的,调用b()执行时b=2,b的引用被改变了,如果再次调用b();那么会报错b 不是一个function.
可以看下控制台打印结果:
0 b:before function c() b:change 2 c: function c() Uncaught TypeError: b is not a function
总结:函数声明和函数表达式的函数名都是对函数的引用,这个引用可以改变;对于函数表达式中的可选函数名来说,在函数体内此函数名引用不可更改,并且只供该函数体调用自身使用。