2015-09-25 29 views
5

Ho il seguente codice nel mio file HTML:Perché viene chiamata la funzione? JavaScript/Window

<script type="text/javascript"> 
     window.never = function() { 
       console.log('this function is never called'); 
     } 
     (function(d, s, id){ 
      var js, srjs = d.getElementsByTagName(s)[0]; 
      if (d.getElementById(id)) {return;} 
      js = d.createElement(s); js.id = id; 
      js.src = "this.script.does.not.exist.js"; 
      srjs.parentNode.insertBefore(js, srjs); 
     }(document, 'script', 'streamrail-jssdk')); 
    </script> 

Vedere violino: http://jsfiddle.net/sebvaeja/

Guardando la console, si può vedere che window.never funzione è in realtà chiamato ('questa funzione non è mai chiamato 'è scritto sulla console).

Durante il debug di questo con gli strumenti di sviluppo di Chrome, vedo nello stack di chiamata che il chiamante era la chiusura (prima riga: http://jsfiddle.net/sebvaeja/).

Se cambio la non funzione per essere fuori dalla portata globale:

function never() { 
      console.log('this function is never called'); 
    } 

allora non è essere chiamato.

Qualcuno può spiegare perché la funzione window.never viene chiamata? Cosa sta provocando la chiamata? Immagino che abbia qualcosa a che fare con la funzione presente sull'oggetto della finestra, ma non riesco a vedere il ragionamento che sta dietro.

+0

In poche parole, si è verificato un errore di sintassi. :) – isherwood

+0

Anche questo è un duplicato ma non riesco a trovarlo. –

+1

'var log = function() {console.log ('questa funzione è chiamata'); } (42) ' –

risposta

13

L'espressione di una funzione è seguito da parentesi:

window.never = function() { ... } 
(...) 

l'interruzione di riga dopo l'espressione funzione non non terminare la dichiarazione variabile, quindi per il parser che è una chiamata di funzione:

function() { ... }(...) 

In effetti, stai usando la stessa tecnica qui:

(function(d, s, id){ 
    // ... 
}(document, 'script', 'streamrail-jssdk')) 

Questa è un'espressione di funzione seguita da (...) e chiama la funzione.

Soluzione: Aggiungere un punto e virgola dopo la definizione e si sta bene.


Se cambio la non funzione per essere fuori dalla portata globale ... allora non è stato chiamato.

In questo caso la definizione di funzione viene interpretato come funzione dichiarazione, non espressione. Una dichiarazione di funzione è più simile a una dichiarazione e, pertanto, non può far parte di un'espressione di chiamata . La seguente parentesi viene quindi interpretata come operatore di raggruppamento (come previsto).

5

Posizionare il punto e virgola dopo la dichiarazione di funzione:

window.never = function() { 
      console.log('this function is never called'); 
    }; 

E 'a causa della (...) subito dopo, che attiva la chiamata di funzione.

window.never = function() { 
      console.log('this function is never called'); 
    } 
    (...) // <-- Triggers call of `window.never` 
Problemi correlati