簡體   English   中英

Javascript arguments.callee它的用途是什么

[英]Javascript arguments.callee what is it for

我還沒有找到這個變量的任何完整的跨瀏覽器文檔。

arguments.callee是什么? 它是如何工作的?

它有哪些論據?

arguments.callee是對當前正在調用的函數的引用。 首先要做的事情是:不要使用它:如果你處於嚴格的環境中,它只會出現錯誤。

但是,親自 - 而且我並不孤單 - 我會想念這家酒店。 在我解釋原因之前,我會給你一個偽示例,說明何時使用它:

var looper = (function(someClosureVar)
{
    setTimeout((function(resetTimeout)
    {
        return function()
        {
            //do stuff, stop OR:
            resetTimeout();
        };
    }(arguments.callee)),1000);
}(document.getElementById('foobar')));

我希望你喜歡閉包,因為我這樣做 - 而且這就是很有可能發生arguments.callee的地方。 倒數第二行是錢的位置:

(arguments.callee)

是對閉包范圍內設置初始超時的匿名函數的引用(在這種情況下可以訪問1個DOM元素)。 匿名函數在返回后是GC'ed,但在這種情況下,我已將它添加到超時回調的作用域(將其作為參數傳遞給另一個返回實際回調的匿名函數),因此它仍被引用到某處。
現在,如果你是嚴格的,你不必擔心,因為這是代碼在嚴格模式下的樣子:

var looper = (function tempName(someClosureVar)
{
    setTimeout((function(resetTimeout)
    {
        return function()
        {
            //do stuff, stop OR:
            resetTimeout();
        };
    }(tempName)),1000);
}(document.getElementById('foobar')));

命名函數,就是這樣。 我為什么不喜歡它? arguments.callee引發了標志,就像一些封閉技巧正在進行的匿名函數一樣。 我想這只是一種習慣,但我認為,它可以幫助我更輕松地構建和調試我的代碼。
結合IE的病態仇恨,這對任何做客戶端腳本的人來說都很自然。 不支持嚴格模式的IE版本往往會將函數名稱泄漏到全局名稱空間,因此永遠不會允許與函數關聯的內存(以及我們創建的閉包)進行GC操作。 這可能導致循環引用,更糟糕的是,循環DOM引用,這可能導致內存泄漏。

實際上: 這是另一個使用arguments.callee 實例 :事件委托和分離事件監聽器
這里有一些關於JS嚴格模式和使用arguments.callee遞歸的更多信息

最后一個問題,IMO是關於arguments.callee如何方便的最明確的例子:遞歸替換函數:

function someF(foo)
{
    //'use strict'; <-- would throw errors here
    foo = foo.replace(/(a|b)+/gi, function (p1,p2)
    {
        if (p1.match(/(a|b){2,}/i))
        {
            return p1.replace(/(a|b)/gi,arguments.callee);//recursive
        }
        return (p2.match(/a/i) ? 'X':'Y');
    });
}

正如在MDN上請求的arguments.callee ,警告在嚴格模式下使用(ECMA 5,這解釋了為什么DC說arguments.callee已被棄用)
而且更嚴格

Calee是ECMAScript 3標准的一部分,因此對於跨瀏覽器使用應該是安全的。 Callee保存當前正在執行的函數,調用它將調用當前函數。 因此callee使用與封閉函數完全相同的參數(或者更確切地說它當前函數)。 有關更多信息,請訪問: https//developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

使用被叫者被認為是不好的風格。 為您提供一個名稱,並使用此名稱...

它指定當前正在執行的函數,因此arguments.callee是當前函數。 如果你需要在無窮大的函數中遞歸,這可能會有所幫助。 這里來自mozilla的例子:

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);
   };
}

var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)

callee是arguments對象的屬性。 它可用於引用該函數的函數體內當前正在執行的函數。

MDN在這里提供文檔

arguments.callee是一個關於通過詢問“誰在調用這個特定參數?”來了解當前執行函數的方法。

 function factorial(a){
    if(a>0)
      return a*arguments.callee(a-1);
 }

這里,如果你調用factorial(5),它將檢查大於0的條件,如果為真,則將為下一個較小的數字執行相同的邏輯。 在某些情況下,您不知道要調用的函數的名稱。 .so你可以使用這個屬性

這是一個很好的參考

來自MDN的arguments.callee

更新:在ES5中不推薦使用arguments.callee()

暫無
暫無

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

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