2015-11-10 20 views
7

Secondo JavaScript reference:Perché passare "null" a "apply" o "call"?

Il valore nullo è un letterale rappresenta valore "vuoto" null o un JavaScript, cioè nessun valore oggetto è presente. È uno dei valori primitivi di JavaScript .

function getMax(arr){ 
    return Math.max.apply(null, arr); 
} 

Non sarebbe esplicitamente passando la parola this essere più chiaro? O almeno più leggibile. Poi di nuovo a questo punto non può capire perché si dovrebbe utilizzare null

+1

Beh, c'è questo http://stackoverflow.com/questions/13397187/passing-null-to-function-call, ma non mi piace la risposta c'è – epascarello

+1

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". –

risposta

7

Calling apply con null come primo argomento è come chiamare la funzione senza fornire alcun oggetto per il this.

Cosa fa il metodo apply?

Procedimento apply() chiama la funzione con un dato valore this e arguments fornito come un array (o un oggetto array-like).

fun.apply(thisArg, [argsArray]) 

thisArg

Il valore di questo previsto per la chiamata al divertimento. Notare che questo non può essere il valore effettivo visto dal metodo: se il metodo è una funzione nel codice di modalità non-strict , null e undefined verrà sostituito con l'oggetto globale ei valori primitivi saranno racchiusi.

Ulteriori documenti sono disponibili here.

+2

Questo non risponde "perché" qualcuno farebbe questo, che è ciò che l'OP sta chiedendo. – meetalexjohnson

8

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.

1

Sono un po 'in ritardo per rispondere a questo. Proverò a dare una lunga spiegazione descrittiva qui.

Che cos'è null in JavaScript?

Il valore null è un valore letterale (non può essere una proprietà dell'oggetto globale come non definito). È uno dei valori primitivi di JavaScript.

Nelle API, il valore nullo viene spesso recuperato nel punto in cui è possibile prevedere un oggetto ma nessun oggetto è rilevante.

fun.apply (thisArg, [argsArray])

thisArg: Il valore di questo previsto per la chiamata al divertimento. Si noti che questo potrebbe non essere il valore effettivo visto dal metodo: se il metodo è una funzione in codice di modalità non rigida, null e undefined verranno sostituiti con l'oggetto globale e i valori primitivi saranno racchiusi.

argsArray: Un oggetto di tipo array, che specifica gli argomenti con cui deve essere chiamato il divertimento o null o non definito se non è necessario fornire argomenti alla funzione. A partire da ECMAScript 5 questi argomenti possono essere un oggetto generico simile ad un array invece che un array. Vedi sotto per informazioni sulla compatibilità del browser.

Se si utilizza 'modalità rigorosa', allora è consigliabile passare il questo o la matematica come parametro.

+0

Ciao! Che cosa significasse significato per i valori primitivi sarà inscatolato sotto la tua spiegazione di questoArg? –

Problemi correlati