JavaScript中的函数重新分配

JavaScript中的函数重新分配,javascript,closures,higher-order-functions,Javascript,Closures,Higher Order Functions,我有一个用javascript编写的函数,它跟踪传递给它的函数的递归调用 函数跟踪(fn){ 设缩进=0 返回函数tracedFunction(args){ console.log(“|”。重复(缩进)+“|--”+fn.name,args) 缩进+=1 let值=fn(args) console.log(“|”。重复(缩进)+“|--”+“返回”,值) 缩进-=1 返回值 } } 函数fibo(num){ 如果(num==0 | | num==1) 返回1; 返回fibo(num-1)+fib

我有一个用javascript编写的函数,它跟踪传递给它的函数的递归调用

函数跟踪(fn){
设缩进=0
返回函数tracedFunction(args){
console.log(“|”。重复(缩进)+“|--”+fn.name,args)
缩进+=1
let值=fn(args)
console.log(“|”。重复(缩进)+“|--”+“返回”,值)
缩进-=1
返回值
}
}
函数fibo(num){
如果(num==0 | | num==1)
返回1;
返回fibo(num-1)+fibo(num-2);
}
fibo=跟踪(fibo)
fibo(4)
这将提供以下输出

|--fibo 4
| |--fibo 3
| | |--fibo 2
| | | |--fibo 1
| | | | |--return 1
| | | |--fibo 0
| | | | |--return 1
| | | |--return 2
| | |--fibo 1
| | | |--return 1
| | |--return 3
| |--fibo 2
| | |--fibo 1
| | | |--return 1
| | |--fibo 0
| | | |--return 1
| | |--return 2
| |--return 5
5
我的问题如下
  • fibo=trace(fibo)
    中发生了什么

    • A是否重新定义了
      fibo
      功能
    • B是否在全局范围内创建名为
      fibo
      的变量,并将
      trace(fibo)
      赋值给它

    • 如果(A)是这样的话,这样做是否一个好的做法?还有别的办法吗


  • 你在这里做的被称为“装饰师”。这是python中非常常见和广泛使用的特性,但在JS中,经过大约5年的工作,它们仍然在队列中。Transpiler和TypeScript确实支持decorator,但仍然无法修饰函数,只能修饰方法,因此您必须将
    fibo
    封装在类中才能工作(如果您问我,这看起来很愚蠢):

    在decorator语法标准化并正确实现之前,修饰函数的唯一方法是如何编写它-应用decorator并重新指定给原始名称


    为了回答您的问题,A和B都是函数——函数在javascript中是第一类的,因此将函数值赋给变量会将该变量绑定到该函数,旧函数将丢失。函数声明语法
    Function foo(){…}
    基本上只是
    var foo=Function….
    的一个快捷方式(直到一些令人讨厌的细节)。

    它只是给变量赋值。您好,这现在有意义了。我曾认为重新分配功能是一种糟糕的做法。是否有任何方法可以将此逻辑
    fibo=trace(fibo)
    包含在
    trace
    函数本身中。@AlanLal:一般来说,不可以。这就是为什么装饰器只能用于对象方法,而不能用于函数的原因之一。
    function trace(target, propertyKey, descriptor) {
        let indent = 0;
        let fn = target[propertyKey];
    
        descriptor.value = function tracedFunction(args){
           etc
         }
    }
    
    class Dummy {
        @trace
        static fibo(num) {
            if (num == 0 || num == 1)
                return 1;
            return Dummy.fibo(num - 1) + Dummy.fibo(num - 2);
        }
    }
    
    Dummy.fibo(4)