Perché passare "null" a "apply" o "call"?
Quando non v'è alcun valore si desidera specificare per il puntatore this
all'interno della funzione e la funzione che si sta chiamando non si aspetta un particolare valore this
al fine di funzionare correttamente.
Non passare esplicitamente la parola chiave è più chiaro? O almeno più leggibile. Quindi, a questo punto, potrei non capire perché tu userai null.
Nel vostro caso specifico, probabilmente la cosa migliore da passare è l'oggetto Math
:
function getMax(arr){
return Math.max.apply(Math, arr);
}
Mentre si scopre che essa non importa che cosa si passa, come il primo argomento per Math.max.apply(...)
(solo a causa delle specifiche di implementazione di Math.max()
), passando Math
imposta il puntatore this
sulla stessa identica cosa a cui sarebbe impostato quando lo chiama normalmente come Math.max(1,2,3)
quindi è l'opzione più sicura in quanto è meglio simulare una chiamata normale a Math.max()
.
Perché passare "null" a "apply" o "call"?
Ecco qualche dettaglio in più ... Quando si utilizza .call()
o .apply()
, null
può essere passato quando si dispone di alcun valore specifico che si desidera impostare il puntatore this
da e si sa che la funzione che si sta chiamando non è mi aspetto che this
abbia un valore specifico (ad es. non usa this
nella sua implementazione).
Nota: l'utilizzo di null
con .apply()
o .call()
viene eseguito solo con funzioni che sono solo metodi per ragioni di spazio dei nomi, non per motivi orientati agli oggetti. In altre parole, la funzione max()
è un metodo sull'oggetto Math
solo per motivi di namespace, non perché l'oggetto Math
ha dati di istanza a cui il metodo .max()
deve accedere.
Se stavi facendo in questo modo:
function foo() {
this.multiplier = 1;
}
foo.prototype.setMultiplier = function(val) {
this.multiplier = val;
}
foo.prototype.weightNumbers = function() {
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum += (arguments[i] * this.multiplier);
}
return sum/arguments.length;
}
var x = new foo();
x.setMultiplier(3);
var numbers = [1, 2, 3]
console.log(x.weightNumbers.apply(x, numbers));
Quando il metodo che si sta chiamando .apply()
sulle necessità di accedere ai dati di istanza, quindi si deve passare l'oggetto appropriato come primo argomento in modo che il metodo ha il puntatore this
corretto per fare il suo lavoro come previsto.
Beh, c'è questo http://stackoverflow.com/questions/13397187/passing-null-to-function-call, ma non mi piace la risposta c'è – epascarello
Di solito è più di una decisione di progettazione, passando null (o indefinito) stai dicendo esplicitamente "La funzione che sto chiamando è pura, non dovrebbe/non dovrebbe essere necessario fare nulla con un contesto." a volte seguito da "È possibile chiamare questa funzione più e più volte e restituirà lo stesso risultato". –