2011-09-01 20 views
8

私はjavascriptの 'call'に関する質問があります。「コール」はどのようにjavascriptで動作しますか?

var humanWithHand = function(){ 
    this.raiseHand = function(){ 
     alert("raise hand"); 
    } 
} 

var humanWithFoot = function(){ 
    this.raiseFoot = function(){ 
     alert("raise foot"); 
    } 
} 

var human = function(){ 

    humanWithHand.call(this); 
    humanWithFoot.call(this); 

} 

var test = new human(); 

so ..私がhumanWithHand.call(this)として 'call'を使用すると、内部的にはどうなりますか?

humanWithHandは、そのプロパティとメンバを人間の変数のプロトタイプにコピー(またはポイント?)しますか?

+0

[MDN Documentation call()](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Function/call) – epascarello

答えて

7

.call()this値を設定し、あなたが.call()に渡される引数で関数を呼び出します。関数.call()を使用するのは、呼び出された関数の内部でthisの値を設定したいときに、関数を直接呼び出すのではなく、通常どんなjavascriptにでも設定できるようにすることです。

.apply()は姉妹機能です。 thisの値を設定することもできますし、配列内の引数を取ることができるので、他の関数呼び出しから可変引数リストを渡そうとしているときや、引数リストをプログラマチックに構成していて、状況に応じて議論が行われる。

9

Yehuda Katzは、JavaScriptのFunction#callメソッドのa good writeupを持っています。彼の書き込みは、あなたの質問に答えなければならず、多くの更なる質問があります。

あなたは一般的な構文を使用して、関数を直接呼び出す

var foo = function() { 
    console.log("foo"); 
    return this; 
}; 
foo(); // evaluates to `window` 

その後this関数呼び出しの内部には、関数呼び出しの外にあるものは何でもthisです。既定では、ブラウザでは、のいずれかの関数呼び出しの外にthisがあります。したがって、上記の関数呼び出しの内部では、thisもデフォルトでwindowです。あなたはメソッド呼び出しの構文を使用して関数を呼び出す

:関数呼び出し内で次に

var bar = { 
    foo: function() { 
    console.log("foo"); 
    return this; 
    } 
}; 
bar.foo(); // evaluates to `bar` 

thisは、一番右の期間の左にある対象である:この場合は、bar

callを使用してこの状況をシミュレートできます。

あなたは対象外機能を設定して、オブジェクトに設定関数呼び出し内thisでそれを呼びたい、次のことができます。

var foo = function() { 
    console.log("foo"); 
    return this; 
} 
var bar = { }; 
foo.call(bar); // evaluates to `bar` 

あなたが同様に引数を渡すために、この技術を使用することができます。

var foo = function(arg1, arg2) { 
    console.log("foo"); 
    return arg1 + arg2; 
} 
var bar = { }; 
foo.call(bar, "abc", "xyz"); // evaluates to `"abcxyz"` 
+0

大きな説明 –

関連する問題