2012-12-27 25 views
1

我做的研究相當多,但一直沒能找到任何答案,什麼似乎是一個簡單的問題:指的是當前的功能,而不使用其名稱/ arguments.callee的

我想關聯有功能的特性(在該項功能的靜態變量使用),像這樣:

function foo() { 
    if (!foo.counter) { 
     foo.counter = 1; 
    } 
    else { 
     foo.counter++ 
    } 
    // rest of the function code goes here... 
} 

如果我以後更改函數的名稱,我不希望有內部改變對它的引用功能定義。 那麼,有沒有辦法引用當前正在執行的函數? (除了arguments.callee現在已被棄用)。像thisFunction這樣的關鍵字?

如果不是,沒有這樣的原因是什麼原因?

+0

請注意,JavaScript中不存在靜態變量。你問的是JavaScript閉包的行爲。 – seliopou

+0

除非您的腳本或函數使用嚴格的ES5模式,否則您不必擔心「棄用」。只要瀏覽器的JavaScript解釋器支持arguments.callee,您就可以安全地使用它。 –

回答

3

我不知道一個標識符或關鍵詞中thisFunction(除了arguments.callee)的JavaScript暴露,但要達到同樣效果的一種方法是名閉合功能foo,並從該關閉返回foo。這樣,你可以隨時使用內foo名稱foo指本身,無論什麼變量它是由你的程序分配到的:

var fn = (function() { 
    function foo() { 

    if (!foo.counter) { 
     foo.counter = 1; 
    } 
    else { 
     foo.counter++ 
    } 
    // rest of the function code goes here... 
    } 

    return foo; 
})(); 
+0

我需要爲多個函數執行此操作,所以我希望更簡單一些(如關鍵字:),而不是將每個函數都包裝在另一個函數中。另外,不保證我/別人不會在將來改變內部函數的名字......讓我面對基本相同的問題......現在只有一個內部函數更深:D 但是,因爲這似乎要成爲JavaScript中最好的人,我接受這個答案。 –

0
function foo() { 
    if (typeof foo.counter=="undefined") { 
    foo.counter = 1; 
    } 
    else { 
    foo.counter++ 
    } 
    return foo; 
} 

var x = new foo(); 
alert(x.counter); //1 
var y = new foo(); 
alert(x.counter); //2 
0

如果您不需要引用計數器的外該功能,這將工作。您不需要設置函數本身的變量,而是可以在函數外定義一個變量,然後讓函數對其進行修改。每當您撥打makeFoo時,它會生成一個新變量x,並使用x返回一個函數。每次調用返回的函數時,它仍然指向由makeFoo創建的相同x。此外,它完全封裝了變量,確保返回的函數外面幾乎沒有任何東西可以改變它(它絕對不會被返回函數之外的大多數東西所改變,但是有足夠的時髦的JavaScript反射,我無法保證沒有什麼會改變它)。當然,在變量之間移動函數不會影響計數器(即x=makeFoo();y=x;x=null;)。

function makeFoo() { 
    var x=0; 
    return function() { 
    x++; 
    return x; 
    } 
} 

//different counters 
x=makeFoo(); 
y=makeFoo(); 
x();//returns 1 
y();//returns 1 
x();//returns 2 
y();//returns 2 

//same counter 
x=makeFoo(); 
y=x; 
x();//returns 1 
y();//returns 2 
x();//returns 3 
y();//returns 4 
相關問題