欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
    总结:函数声明和函数表达式的函数名都是对函数的引用,这个引用可以改变;对于函数表达式中的可选函数名来说,在函数体内此函数名引用不可更改,并且只供该函数体调用自身使用。