Super prosta funkcja:

function equals(a,b){return a==b;}

Kiedy to nazywam tak, działa dobrze i zwraca prawdziwe:

equals(1,1)

Kiedy nazywam to tak, choć zwraca fałszywe, a nie rozumiem, dlaczego:

equals.call(1,1)

Myślałem, że invoking Function.Call był taki sam jak wywoływanie funkcji. Czego tutaj tęsknię?

2
zachvac 28 czerwiec 2017, 00:49

7 odpowiedzi

Najlepsza odpowiedź

Pierwszy argument, którego oczekuje .call jest wartością dla this w tym inwokacji funkcji, a następnie argumenty, które chcesz przejść do funkcji.

Ponieważ funkcja nie zawiera żadnego odniesienia do this, możesz uzyskać wynik, który chcesz, przechodząc null jako pierwszy argument:

equals.call(null, 1,1);

Więcej informacji na temat tej metody można znaleźć w tej metodzie w Dokumentach MDN {X0}}

4
Pineda 27 czerwiec 2017, 21:53

Jeśli chcesz, aby zadzwonić do wykonania bez określania NULL lub nieokreślony jako pierwszy parametr, można przepisać kod w następujący sposób:

function equals(a,b) {
  var w = window;
  return (w.a == w.b);
}

d = document;
d.g = d.getElementById;

var a = 1;
var b = 1;
var res = equals.call(a,b);

d.g("answer").innerHTML= "\n<BR>" + a + " ==  " + b + "? " + res + "\n";

a = 5;
b = 9;
res = equals.call(a,b);

d.g("answer").innerHTML += "\n<BR>" + a + " ==  " + b + "? " + res;
#answer {
font: 22pt Arial,Helvetica;
color: #090;
}
<div id="answer"></div>

Zobacz Zasób

Jeśli jednak chcesz po prostu podać kontekst z NULL lub niezdefiniowany w wywołaniu funkcji, upewnij się, że opuszczenie tego argumentu w definicji funkcji lub może wystąpić niepoprawny wynik; Zobacz Dobre i Zły.

0
slevy1 28 czerwiec 2017, 00:13

Jak stwierdzono Oto:

Metoda połączenia () wywołuje funkcję z danym wartością i argumentami indywidualnie dostarczonymi.

Pierwszym parametrem jest wartość this:

function.call(thisArg, arg1, arg2, ...)

Odkąd przekazujesz wartość 1, jest używany jako this, który najwyraźniej nie jest poprawny. Powinieneś przejść na początku null i dwie liczby.

equals.call(null, 1, 1)
1
AtheistP3ace 27 czerwiec 2017, 21:56

Pierwszym argumentem .Call jest kontekstem (= co się dzieje).

Więc możesz zrobić:

equals.call(undefined, 1, 1);

Ale jest raczej bezcelowy.

Więcej czytania o. Call: HTTPS: // deweloper.mozilla.org/en-us/docs/web/javascript/derence/global_objects/function/call.

1
WuDo 27 czerwiec 2017, 21:53

Pierwszy argument wezwania powinien być this. Lubię to:

equals.call(this,1,1)

W twojej wersji próbowała porównać jeden z niezdefiniowany, ponieważ nie było trzeciego parametru.

Przeczytaj więcej tutaj: HTTPS: // Deweloper. mozilla.org/en-us/docs/web/javascript/reference/global_objects/function/call.

1
JuhG 27 czerwiec 2017, 21:53

Pierwszy argument przy użyciu .call jest odniesieniem do "tego".

Zobacz ten JSFiddle na przykład: https://jsfiddle.net/4HFRCRCC3SK/

1
Matt 27 czerwiec 2017, 21:52

Pierwszy argument w Function.prototype.call jest dla wartości, którą funkcja traktuje jako this. Ponieważ funkcja nie używa this, możesz po prostu przekazać wszystko, co lubisz, np. null:

equals.call(null, 1, 1)
2
Peter Olson 27 czerwiec 2017, 21:52