2013-02-07 12 views
11

non posso fare a meno di notare ci sono due funzioni apparentemente inutili nel codice sorgente di jQuery (per v1.9.1, è la linea 2702 e la linea 2706):returnTrue e returnFalse funzioni in fonte jQuery

function returnTrue() { 
    return true; 
} 

function returnFalse() { 
    return false; 
} 

Che entrambi sono chiamati abbastanza spesso in jQuery. C'è un motivo per cui non sostituiscono semplicemente la chiamata di funzione con un booleano true o false?

+0

Oltre alle risposte qui sotto, probabilmente ci sono anche motivi di prestazioni per una definizione unica al posto delle funzioni anonime in tutto. –

risposta

4

è stato utilizzato in questo modo:

stopImmediatePropagation: function() { 
    this.isImmediatePropagationStopped = returnTrue; 
    this.stopPropagation(); 
} 

qui isImmediatePropagationStopped è una query metodo di. utilizzato come questo event.isImmediatePropagationStopped()

naturalmente, è possibile definire un metodo di istanza, come:

event.prototyoe.isImmediatePropagationStopped = function() { return this._isImmediatePropagationStopped }; 

stopImmediatePropagation: function() { 
    this._isImmediatePropagationStopped = true; //or false at other place. 
    this.stopPropagation(); 
} 

ma si deve introdurre una nuova proprietà di istanza _isImmediatePropagationStopped per memorizzare lo stato.

con questo trucco, è possibile tagliare gruppo di proprietà di istanza per una tenuta vero stato/falso qui, come _isImmediatePropagationStopped, _isDefaultPrevented ecc

in modo che, a mio parere, questa è solo una questione di stile di codice, non giusto o sbagliato.

PS: i metodi di query su evento, come isDefaultPrevented, isPropagationStopped, isImmediatePropagationStopped sono definiti nel livello di evento DOM 3 sepc.

spec: http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-Event-isImmediatePropagationStopped

+0

Allora perché non usare change 'isImmediatePropagationStopped' per essere invece una proprietà di istanza? Quindi possiamo usarlo come 'if (event.isImmediatePropagationStopped)' invece di 'if (event.isImmediatePropagationStopped())'? – rexcfnghk

+0

Fa parte anche delle specifiche W3C (non so perché hai cancellato il commento): http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html# Eventi-Evento -ImmediatePropagationStopped –

+0

perché l'api è definita da w3c: ** http: //www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html # Events-Event-isDefaultPrevented ** –

11

Se una proprietà dell'oggetto, un argomento di funzione, ecc. Si aspetta un function, è necessario fornire un function non un boolean.

Per esempio in vaniglia JavaScript:

var a = document.createElement("a"); 
a.href = "http://www.google.com/"; 
/* 
* see https://developer.mozilla.org/en-US/docs/DOM/element.onclick 
* element.onclick = functionRef; 
* where functionRef is a function - often a name of a function declared 
* elsewhere or a function expression. 
*/ 
a.onclick = true;      // wrong 
a.onclick = returnTrue;     // correct 
a.onclick = function() { return true; }; // correct 

Inoltre, la scrittura:

someProperty: returnTrue, 

è più conveniente che la scrittura:

someProperty: function(){ 
    return true; 
}, 

Soprattutto perché sono chiamati molto spesso .

+0

Puoi spiegare perché non puoi semplicemente usare 'someProperty: true'? – rexcfnghk

+4

'true' è diverso da una funzione che restituisce true. Se alcune proprietà o argomenti richiedono una funzione, non è possibile sostituirli con il letterale 'true'. –

Problemi correlati