Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    tipo undefined, variabile primitive e oggetti DOM

    ciao ragazzzzz

    non capsico perche se fai:

    if(window.nonEsiste == undefined){
    alert("NO")
    }

    FUNZIONA (allerta "NO")

    e se fai invece

    if(miaVariabileMaiDefinita == undefined){
    alert("NO")
    }

    ti da errore!! quando stai trattando variabili primitive devi fare invece:

    if(typeof miaVariabileMaiDefinita == "undefined"){
    alert("NO")
    }

    What the hell? Mi sembra inconsistente! Perche con gli oggetti si e con le primitive no? chiamate voi mozilla?

  2. #2
    beh, proprio per la natura degli oggetti:

    Se hai un oggetto hai un reference valido ad un'allocazione della memoria che chiamo l'oggetto stesso, per questo motivo quando chiami una funzione o un attributo sull'oggetto l'interprete JS sa dove deve guardare.

    Per dirla in parole povere, facendo window.nonEsiste, tu gli dici "prendi quell'oggetto ed ottieni nonEsiste (che sia funzione o proprietà)" ma se fai solo nonEsiste tu gli dici "Vai a prendere nonEsiste" e l'interprete non sa se è un reference ad un oggetto, o il puntatore (che poi non si dice così, ma non mi ricordo il nome) ad un variabile, o se è una funzione, l'interprete sa solo che esiste e deve cercarla, ma siccome non esiste ritorna NON un undefinied, ma un'ECCEZIONE (un errore).

    facendo typeof tu chiami una keyword di JS che effettua un'azione, in questo caso sa come comportarsi, perchè, come con l'oggetto di prima, esiste typeof, per cui ritorna undefinied e non un eccezione.

    Spero di essermi spiegato.

  3. #3
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    si ma concettualmente

    window.nonEsiste == nonEsiste == window["nonEsiste"] == this.nonEsiste

    capisci il mio sgomento? dovrebbe sempre identificarlo come proprieta' del super mega semprepresente oggetto window in ogni caso. boh?

  4. #4
    nonono

    scrivere nonEsiste non significa necessariamente this.nonEsiste, ma va a cercare variabili locali, funzioni locali, variabili globali, funzioni globali (forse cerca prima le funzioni, ma il senso è quello).

    Se OGNI ricerca da esito negativo l'interpreta lancia un Eccezione, undefinied non blocca l'esecuzione, mentre un'eccezione si. Serve ad evitare che ci siano deadlock spiacevoli.

    L'interprete deve sempre avere qualcosa su cui lavorare (il reference dell'oggetto o il typeof) o va in blocco.

  5. #5
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    si si si

    nello spazio gloabale di uno script this == window

  6. #6
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    anzi mi correggo:

    this == window // false per qualche ragione che ignoro
    this.x = "ciao"
    alert(window.x) // ciao

  7. #7
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    no anzi mi ricorreggo di nuovo (firebug e' fuori di testa , faranno bene a debuggarlo)

    <script type="text/javascript">
    x = "ciao"
    alert(this.x) // ciao
    alert(window == this) // true
    </script>

  8. #8
    this, rappresenta lo scope di esecuzione di JS.

    Lo scope è il node dell'albero che parte dall'oggetto window in cui ci si trova al momento dell'esecuzione:

    Ti faccio un esempio ottimo:
    Codice PHP:
    window.onload = function(){
       
    alert(this.toString()); /*Lo scope è l'oggetto window in questo momento*/

       
    var div document.getElementbyId('MyDiv');
       
    //Div contiene l'oggetto che fa riferimento all'element div id="MyDiv"
       
    div.onclick = function()
       {
          
    alert(this.toString()); /*Lo scope è l'oggetto DIV non window. 
          Essendo div un figlio del nodo window ha accesso a tutti le proprietà definite 
          nell'oggetto padre window*/
          
    document.body.onmouseup = function(){
             
    alert(this.toString()); /*Qui lo scope è l'elemento body, non più div, tra l'altro
             non potrei accedere alle variabili globali di div, non senza ottenere l'oggetto div.
             Inoltre se avessi definito una variabile nella funzione onclick del div non potrei 
             accedervi, perché  lo scope sarebbe esterno alla funzione dove sono state 
             definite.*/
          
    }
       }


  9. #9
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    ma dai!! lo so cos'e' this man!

    quello che non mi spiego e perche non cerchi in window (oggeto) quando cerco di fare

    x == undefined#

    dato che e' chiaro che x == this.x

    e this == window nel contesto globale che possiede (coem dici tu) un reference valido

  10. #10
    ma non è affatto scontato!

    Se tu fai this in uno scope diverso da window su una variabile globale (quindi in window) ti becchi un bel null, perché this indica SOLO lo scope, non viene inoltrato a quello contenitore automaticamente, perché sebbene gli oggetti siano figli del nodo window non lo estendono, non sono sotto classi di window, con i suoi metodi e variabili innate.
    Gli elementi sono sottoclassi di Element, non Window. Infatti, se fai document.getElementById('MyDiv').alert("Qualcosa") ti becchi una bella eccezione di Method not found.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.