[英]Pass a global variable to a function for reassignment in javascript
[英]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
fibo = trace(fibo)
行發生了什么?
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)
在裝飾器語法標准化並正確實現之前,裝飾 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.