2012-02-08 6 views
4

Modernizrのソースコードにこの抜粋があります。javascriptでcall.callが達成すること

var documentCreateElement = scopeDocument.createElement, documentCreateDocumentFragment = scopeDocument.createDocumentFragment; 

// shiv the document 
for (var i = 0, elements = html5.elements, l = elements.length; i < l; ++i) { 
    call.call(documentCreateElement, scopeDocument, elements[i]); 
} 

// shiv the document create element method 
scopeDocument.createElement = function (nodeName) { 
var element = call.call(documentCreateElement, scopeDocument, nodeName); 

対立するものとしてdocumentCreateElement.call(scopeDocument,nodeName)ないことだけcall何を達成されたために、call.callを使用する必要があった理由を私は不思議でしたか?事前

+0

確かにこれは 'call'が何であるかにかかっていますか? 'documentCreateElement.call(...)'は 'documentCreateElement'を呼び出します。 'call.call'は' call'を呼び出します。したがって、 'call.call(documentCreateElement、...) '' call'が 'Function.prototype.call'の場合にのみ' documentCreateElement'を呼び出します - 名前にもかかわらず、そうではないかもしれません。 – ruakh

+0

(これを少し不透明にするには、コードが 'CALL.call(documentCreateElement、...)'であったとします。 'documentCreateElement.call(...)'と同じであると仮定しますか?変数 'CALL'の名前が' call'に変更されているので、関数オブジェクトの 'call'メソッドのコピーであるとは限りません)。 – ruakh

+0

@ruakh [source code]( http://www.modernizr.com/downloads/modernizr-2.5.2.js)。 'call' - >' Date.call' - > 'Function.prototype.call'です。 –

答えて

1

おかげではい、それはdocumentCreateElement機能のコンテキストから.call関数を呼び出します。だから、最終的にそれは同じだ

...

documentCreateElement.call(scopeDocument, nodeName); 

は、私は彼らはおそらくそれを取得する場合にはcall方法をキャッシュFunction.prototype.callへの参照が

var call = Function.prototype.call 

のように、どこかがあることを前提としFunction.prototypeに上書きされます。


EDIT:

@ruakhは、以下の指摘したようにFunction.prototype.callが上書きされた場合、それはまたFunction.prototypeに依存していることから、その後、call.callは動作しません。

documentCreateElementは、document.createElementメソッドへの参照であり、そのメソッドはホストオブジェクトなので、プロトタイプチェーンにFunction.prototypeが含まれる保証はありません。

これにより、ホストオブジェクトに.callを使用することができます。

+1

それは私の質問のようなものでした。「documentCreateElement.call(scopeDocument、nodeName)を達成するのはどうですか?」私はなぜ彼らがcall.callを使用することを選択したのだろうかと疑問に思っています – user772110

+0

実際には、 'Function.prototype.call'に解決される' var call = Date.call; ' –

+0

@ user772110:更新しました。私は、 'Function.prototype.call'が他のコードによって上書きされた場合に備えて推測しています。 –

1

call.callは、ユーザ定義関数callを別のコンテキストと呼びます。

callはネイティブJavaScript関数です。必要があり、P

callの最初のパラメータはコンテキストは何でもthis:それは、JavaScript関数に非常に混乱している、ファーストクラスの市民であり、それはcallと呼ばれていますので、あなたが機能を呼び出すことができます機能です呼び出される関数を参照してください。次に例を示します。

function doit() { 
    console.log(this.myvalue); 
} 

function callit(context) { 
    doit.call(context); 
} 

callit({ "myvalue": "a value"}); // a value 
var obj = { 
    "stuff" : "more stuff", 
    "myvalue": "some value" 
}; 
callit(obj); // some value 

のでdocumentCreateElement.call(scopeDocument,nodeName)は、基本的scopeDocumentdocumentCreateElement(nodeName)が、thisdocumentCreateElementでポイントを行います。あなたが掲示したサンプルコードがcallをうまく使っているかどうか疑問に思うかもしれません。間違って使い方が間違っていると、私はいつも非常に複雑だと感じています〜_〜

関連する問題