2011-09-01 9 views
8

Mam pytanie dotyczące "połączenia" w javascript.Jak działa "zadzwoń" w 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(); 

Więc .. kiedy używam "zadzwoń" jako humanWithHand.call (this), co dzieje się wewnętrznie?

wykonuje humanWithHand zmiennych kopii (lub punktów?) Jego właściwości i członków do prototypu ludzkiej zmiennej?

+0

[Zaproszenie do dokumentacji MDN()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call) – epascarello

Odpowiedz

7

.call() ustawia wartość this a następnie wywołuje funkcję z argumentami zdałeś do .call(). Używasz .call() zamiast wywoływać funkcję bezpośrednio, gdy chcesz ustawić wartość this wewnątrz wywoływanej funkcji, zamiast pozwalać, aby była ustawiona na to, co normalnie ustawiłby javascript.

.apply() jest funkcją siostrzaną. Może również ustawić wartość this i może przyjmować argumenty w tablicy, dzięki czemu może być używana, gdy próbujesz przekazać listę zmiennych z innego wywołania funkcji lub gdy programowo tworzysz listę argumentów, które mogą mieć różne numery argumentów w zależności od sytuacji.

9

Yehuda Katz ma a good writeup metody JavaScript Function#call. Jego zapis powinien odpowiedzieć na twoje pytanie i wiele innych pytań uzupełniających.

Podczas wywołania funkcji bezpośrednio, stosując ogólną składnię:

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

Następnie this wewnątrz wywołania funkcji jest cokolwiek this jest poza wywołania funkcji. Domyślnie w przeglądarcepoza wszelkimi wywołaniami funkcji jest window. Wewnątrz funkcji wywołanie jak wyżej, this jest również domyślnie window.

Podczas wywołania funkcji przy użyciu składni metoda-Call:

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

Następnie this wewnątrz wywołania funkcji jest obiekt w lewo okresu skrajnej prawej: w tym przypadku, bar.

Możemy zasymulować tę sytuację za pomocą call.

Po skonfigurowaniu funkcji na zewnątrz obiektu i chcesz się połączyć je z this wewnątrz wywołania funkcji ustawiony na obiekcie, można:

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

Możesz użyć tej techniki do przekazywania argumentów, a także:

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

Świetne wyjaśnienie –