2011-01-17 21 views
56

In tutto il Web, vedo un vasto numero di programmatori JavaScript che scrivono window.location anziché solo location. Ero curioso di sapere se qualcuno potesse offrire una spiegazione del perché. window è l'oggetto globale e pertanto non è necessario includere - non è vero? Voglio dire, non vedi le persone scrivere window.Math.floor o new window.Date(), quindi sono curioso di sapere perché sarebbe stato specificato con location.window.location contro solo posizione

Capisco che location sia considerata una "proprietà" della finestra in cui ci si trova, cosa che a mio avviso ha un senso. Ma anche così, non vedo alcun motivo per specificare l'oggetto globale; non è possibile sovrascrivere lo location in primo luogo, non senza reindirizzare la pagina.

Quindi, questo è solo un capriccio che è stato usato per così tanto tempo da essere integrato con il modo in cui scriviamo JavaScript, o c'è qualche motivo tangibile per fare le cose in questo modo? Ho controllato Google, ma purtroppo non ho trovato nulla ...

risposta

57

uso sempre window.location nel mio codice per due motivi principali:

  1. E 'una buona abitudine per evitare variabili globali quando possibile. L'uso del prefisso window. mi ricorda che la variabile è globale e che altre non lo sono.
  2. La natura dello scope di Javascript consente di sostituire le variabili impostate più in alto nella struttura ad albero. Ciò significa che potresti aver impostato var location da qualche parte in un ambito di contenimento (non è una parola improbabile da utilizzare come nome di variabile) e invece dovresti lavorarci su.

Per me, chiarezza di intenti quando si scrive codice è molto importante in quanto aiuta a evitare di scrivere i bug e poi mi aiuta a trovare loro quando lo faccio.

+0

Immagino anche che dire a JS dove trovare la variabile invece di farla passare attraverso la catena dell'ambito fino all'ambito globale può essere un approccio più veloce. – Rayjax

+1

@Rayjax No, in realtà, perché JS deve anche scorrere la catena dell'ambito per determinare cosa sia 'window'. – lonesomeday

1

È solo una questione di stile.

Concettualmente, location è una proprietà della window (la finestra è in una posizione), a differenza di Math o Date.

0

Sono in realtà identici. Tecnicamente, l'oggetto "window" È la stessa cosa dell'ambito radice per le variabili Javascript.

6

Parte della codifica è la chiarezza. A differenza di Math o Date, location è concettualmente una proprietà della finestra, quindi il codice diventa più chiaro per includerlo. La finestra." il prefisso dovrebbe idealmente essere rimosso per la minificazione.

Probabilmente avete ragione che molte ragioni sono storiche. Javascript ha una lunga storia di copia e incolla.

+0

Questo è quello che ho pensato, ma ci sono così tante persone che lo fanno; praticamente ogni sorgente che vedo usa 'window.location'. Le uniche pagine "contro" che ho potuto trovare discutono di 'window.location' vs' location.href', che non sono state d'aiuto neanche. – Reid

1

location è una proprietà dell'oggetto window, quindi è possibile ottenerlo richiedendo window.location. Ma se non si specifica un oggetto, JavaScript presuppone che si desidera l'oggetto finestra. Quindi, la sola richiesta di posizione è la stessa richiesta per window.location.

3

L'oggetto window è lo spazio dei nomi di lavoro predefinito, pertanto location sarà uguale a window.location.

Penso che usare location sia un po 'ambiguo, usare window.location per chiarezza.

+1

Ho votato per questa risposta (e quasi nessuna delle altre) perché, immagina questo stupido esempio: 'function f() {var location =" home ";/* in seguito */location = "http://google.com"} '* cry * –

+0

@ user166390 Con questa logica dovresti scrivere' window.document' ogni volta. Dubito che qualcuno lo stia facendo. – superlukas

13

In parte per la sicurezza nel caso in cui qualcuno definisca una variabile location da qualche parte nella catena dell'ambito. lo window.location lo rende un riferimento esplicito alla proprietà di window.

Esempio:http://jsfiddle.net/dr6KH/

(function() { 
    var location = 'new value'; // creating a local variable called "location" 

    (function() { 
     alert(location); // alerts "new value" 

     alert(window.location); // alerts the toString value of window.location 
    })(); 

})(); 
6

C'è una grande differenza tra window.location e il nativo Math e Date oggetti, che è quello Math e Date sono oggetti nativi JavaScript che sono specificati di esistere come proprietà dell'oggetto globale, mentre window.location è una struttura di accoglienza windowoggetto (un oggetto host è un oggetto che rappresenta alcuni aspetti dell'ambiente, fornito dall'ambiente e non è soggetto alle stesse regole degli oggetti JavaScript nativi. Altri oggetti host includono document e qualsiasi elemento DOM).

window nei browser ha due scopi: in primo luogo, agisce come l'oggetto globale ECMAScript (ben specificato) e in secondo luogo, agisce come un oggetto host che fornisce informazioni sull'ambiente del browser. Per gli usi di window nella sua capacità di oggetto host, preferisco essere esplicito e fornire il prefisso window.: il fatto che location lavori senza di esso è solo una coincidenza che deriva dalla natura schizofrenica di window. Inoltre, come sottolineato da altre risposte, questo ha anche il vantaggio di proteggerti nel caso in cui un'altra variabile location esista nel contesto corrente.

Una buona ragione per non prefissare Date o Math con window. è che crea codice che non funziona in un ambiente senza browser. Generalmente gli altri ambienti non forniscono window come alias per l'oggetto globale.

4

Non è sempre solo una questione di stile: stavo tentando di caricare i pulsanti dei social media in modo asincrono dopo l'evento di caricamento della finestra aggiungendo elementi di script a un frammento e quindi aggiungendo quel frammento al documento. Widget.js di Twitter utilizza location.href in diversi punti e causa il seguente errore in IE 8/9: Chiamata inaspettata al metodo o accesso alla proprietà. Non ho capito perché, ma questo accade solo quando si visita la pagina tramite un link da un'altra pagina. Se si aggiunge semplicemente l'elemento di script alla testa o si utilizza window.location.href, ciò non si verifica, quindi sembra essere un po 'strano con IE 8/9 e createDocumentFragment().

Esempio:

<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a> 
<script> 
(function (d, t) { 
    var head = document.getElementsByTagName('head')[0]; 
    var frag = d.createDocumentFragment(); 
    var s = d.createElement(t); 
    s.async = true; 
    s.src = 'http://platform.twitter.com/widgets.js'; 
    frag.appendChild(s); 
    head.appendChild(frag); 
} (document, 'script')); 
</script> 
Problemi correlati