2012-04-29 33 views
3

我發現這個代碼,我不明白註釋塊的目的參數:爲什麼註釋塊中的第二個函數參數?只是好奇

if (!Array.prototype.some) 
{ 
    Array.prototype.some = function(fun /*, thisp*/) 
    { 
    var len = this.length; 
    if (typeof fun != "function") 
     throw new TypeError(); 

    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in this && fun.call(thisp, this[i], i, this)) 
     return true; 
    } 

    return false; 
    }; 
} 

在我看來,這可能是正常的第二個參數,該行可以再刪除:

var thisp = arguments[1]; 
+4

你可以問問原始作者的代碼? –

+1

夥計,這只是一個評論!它沒有意義,它只是在那裏!誰知道他想用這個參數做什麼? – gdoron

+0

似乎這個問題可能會更好地指向有問題的代碼的作者... [編輯添加:哦,看,其他人先到那裏,並說同樣的。我會在這裏留下這個提醒自己刷新之前評論:-) –

回答

0

內置於Firefox的Array.prototype.some的實現具有1的arity,即它接受一個參數。爲了實現第二個可選參數而不更改元素,替換代碼通過arguments[1]來訪問第二個參數。

我實際上並不知道EcmaScript規範對Array.prototype.some的秩序有什麼要說的。

1

如果定義了Array.prototype.some,則原始方法具有第二個參數,即thisp,但由於未定義,因此作者定義了模擬該功能的自己的方法。

作者期望來電者傳遞第二個參數,即thisp。 HTH。

+0

是的,但他可以保存一行代碼避免這種情況。對我來說不合理的行爲。 :) – Luckylooke

+0

@Luckylooke看到這個。 – g13n

+0

好的,我讀了它,並得到它! ;) – Luckylooke

0

你是對的,它應該是一個參數,因爲使用功能arguments 1內的功能是expensive和2。它的硬連接到功能,雖然它可以在實際的循環留undefined。該方法不應該在生產代碼,我會說。再測試一下,目前還不清楚第二個參數實際上究竟做了什麼。 MDN shim是一個奇怪的鴨子,但也許我錯過了一些東西。

相關問題