Perché scriviamo l'azione che deve essere eseguita da una funzione in jQuery all'interno delle parentesi?

0

Generalmente, ogni volta che programmiamo in qualsiasi linguaggio di programmazione, ad esempio C, passiamo i parametri che dobbiamo passare a una funzione utilizzando le parentesi accanto al nome della funzione. Mentre in jQuery, oltre al function() definito dall'utente, scriviamo l'azione di cui abbiamo bisogno per eseguire la funzione all'interno delle parentesi, ad esempio,

$('div').mouseenter(function(){
   /* blah blah blah*/
});

Perché?

    
posta ikartik90 16.10.2013 - 20:18
fonte

5 risposte

5

Questo perché il metodo jQuery mouseenter è in attesa di un singolo parametro, che è una funzione. Può quindi chiamare quella funzione in seguito.

Potremmo scrivere altrettanto facilmente

function blah(){
    /* blah blah blah */
}
$("div").mouseenter(blah);
    
risposta data 16.10.2013 - 20:47
fonte
2

Questo è meno di jquery e di più su come javascript funziona in generale. Passare funzioni come variabili è estremamente vitale per la programmazione in javascript perché javascript è asincrono. Considera questo:

 var a = getA();
 var b = getB(a);

Ora, abbiamo bisogno di "a" prima, quindi lo usiamo per ottenere "b". Ma javascript non garantisce che la funzione getA venga eseguita fino al completamento prima che venga chiamata la funzione getB. Quindi potremmo fare qualcosa di simile invece:

 var b = getA(getB);

Ora la funzione getA può chiamare getB quando finisce.

Nel tuo esempio (non ho cercato, ma presumo) vuoi che il programma guardi ogni div sulla pagina, e quando un mouse immette quel div, esegui un blocco di codice.

Non vogliamo che quel codice venga eseguito immediatamente, su ogni div, non appena jquery lo trova. Vogliamo che div divida quel blocco di codice quando il mouse lo inserisce. Come chiamiamo un blocco di codice che può essere chiamato? La chiamiamo una funzione, figliolo. Quindi non avrebbe senso usare qualcosa di diverso da una funzione.

    
risposta data 16.10.2013 - 23:15
fonte
2

Riscriviamo un po 'il tuo esempio:

function mouseEnterAction() { doStuff(); }

$('div').mouseenter(mouseEnterAction);

L'unica differenza qui è che stiamo usando una funzione con nome qui piuttosto che una funzione senza nome come hai fornito nell'esempio.

Chiediti: qual è il "valore" di un'azione? Non è qualcosa di semplice come il numero 5 o la stringa "Hello World". Non è nemmeno qualcosa di più complesso come un array o un oggetto. Per un'azione da eseguire, è necessario qualcosa in grado di eseguire un'azione - in questo caso, una funzione.

L'idea generale è che stai configurando un gestore di eventi. Quando si verifica l'evento "mouseenter", si esegue la funzione data ed si esegue qualsiasi azione necessaria. Questo non è fondamentalmente una cosa javery / jQuery diversa da C-C può fare cose come questa ma la sintassi è molto più complicata.

    
risposta data 17.10.2013 - 00:50
fonte
0

Generalmente ogni volta che programmiamo in qualsiasi linguaggio di programmazione, diciamo C

C non comprende "alcun linguaggio di programmazione". Ad esempio non ha capacità orientate agli oggetti. Di fatto, in C faresti qualcosa simile al tuo esempio JavaScript / JQuery: passa una funzione come argomento al tuo callback di input dell'utente. Ecco come funziona con GLUT:

void blah() {
   /* blah blah blah */
}

void ODLGameLoop_initOpenGL() {
    glutKeyboardFunc(blah);
}

In C e le funzioni JavaScript sono oggetti di prima classe, il che significa che possono, tra le altre cose, essere passati come argomenti ad altre funzioni.

In linguaggi orientati agli oggetti, come ad esempio Java, avresti bisogno di passare un'istanza di un certo tipo di classe alla funzione di callback, qualcosa del tipo:

class MyMouseListener implements MouseListener {

    public void mouseClicked(MouseEvent e) {
        /* blah blah blah */
    }


    public static void main(String[] args) {
        JFrame myJframe = ....;
        myJFrame.addMouseListener(new MyMouseListener());

    }

}

Questi sono entrambi gli esempi, come dici tu: "dovremmo passare i parametri che dobbiamo passare ad una funzione usando le parentesi accanto al nome della funzione". È solo che in linguaggi che supportano le funzioni come oggetti di prima classe, quei parametri sono (a volte) funzioni, e nelle lingue orientate agli oggetti sono (a volte) oggetti.

    
risposta data 16.10.2013 - 22:55
fonte
0

Poiché la funzione che viene passata alla funzione di ricezione è la funzione di eliminazione, ossia non riutilizzabile. Se fosse riutilizzabile, sarebbe scritto come una funzione (non di chiusura) o un metodo di classe e si passerebbe il nome della funzione invece di "scrivere l'azione di cui abbiamo bisogno per eseguire la funzione all'interno delle parentesi".

Per chiarire, il corpo della funzione (azione) non è scritto "all'interno delle parentesi", è scritto all'interno delle parentesi graffe che fa parte della funzione (). cioè l'azione è non fa parte di mouseenter () ma appartiene a function () che viene passato a mouseenter.

$('div').mouseenter(f);

f = function(){
   /* blah blah blah*/
};

Non è diverso dalle tipiche funzioni di callback in Observer, solo uno stile diverso.

    
risposta data 17.10.2013 - 00:40
fonte

Leggi altre domande sui tag