簡體   English   中英

JavaScript 中的 Function 重新分配

[英]Function reassignment in JavaScript

我有一個用 javascript 編寫的 function ,它跟蹤傳遞給它的 function 的遞歸調用。

function trace(fn){
    let indent = 0

    return function tracedFunction(args){
        console.log("| ".repeat(indent)+"|--"+fn.name,args)
        indent += 1
        let value = fn(args)
        console.log("| ".repeat(indent)+"|--"+"return",value)
        indent -= 1
        return value
    }

}

function fibo(num){
    if(num==0 || num==1)
        return 1;
    return fibo(num-1)+fibo(num-2);
}


fibo = trace(fibo)
fibo(4)

這給出了以下 output

|--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

我的問題如下

  1. fibo = trace(fibo)行發生了什么?

    • A 是否重新定義了fibo那契 function?
    • B 是否在全局 scope 中創建一個名為fibo的變量並將trace(fibo)分配給它?

    • 如果 (A) 是這種情況,這樣做是一個好習慣嗎? 有沒有其他方法可以做到這一點?

你在這里所做的被稱為“裝飾者”。 這是 python 中非常常見且廣泛使用的功能,但在 JS 中,經過大約 5 年的工作,它們仍在排隊中。 轉譯器和 TypeScript 確實支持裝飾器,但仍然無法裝飾 function,只是一種方法,所以你必須將你的fibo包裝在 ZA2F2ED4F8EBC2CBB4C21A29DC40

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)

Typescript 操場

在裝飾器語法標准化並正確實現之前,裝飾 function 的唯一方法是您編寫它的方式 - 應用裝飾器並重新分配給原始名稱。

To answer your questions, it's both A and B -- functions are first class in javascript, so assigning a function value to a variable binds that variable to that function and the old function is lost. Function 聲明語法function foo() {...}基本上只是var foo = function....的快捷方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM