2013-08-22 20 views
13

Mam aplikację, która w trybie debugowania jest zapisana w wielu oddzielnych plikach javascript, ale jest ładowana synchronicznie jako część głównego bloku strony. W wydaniu scalam wszystkie te pliki razem i je minimalizuję. Dzisiaj ciągle znajdowałem błąd w wersji minified, więc załadowałem pojedynczy połączony plik w celu debugowania problemu i odkryłem, że jedna biblioteka sama wykonała funkcję i spowodowała wykonanie innych funkcji zdefiniowanych na window.Dlaczego funkcje na obiekcie są wykonywane z funkcji wykonywania poleceń?

Mam repo'd zachowanie tutaj z ogólnej obiektu, nie ma znaczenia, czy jego okno czy nie:

<head> 
    <script> 
     var a = {} 

     a.X = function x(){ 
      console.log("shouldn't be executed"); 
     } 

     (function(a){ 
      console.log("self execution"); 
     }(a)); 
    </script> 
</head> 

W tym przykładzie, mam wyjście

self execution 
shouldn't be executed 

Jeśli zmienię wywołanie być

<head> 
    <script> 
     var a = {} 

     function x(){ 
      console.log("shouldn't be executed"); 
     } 

     a.X = x; 

     (function(a){ 
      console.log("self execution"); 
     }(a)); 
    </script> 
</head> 

potem po prostu

self execution 

Tego się spodziewałem. W pierwszym przykładzie, dlaczego jest wywoływana, gdy a jest przekazywana do funkcji self executing?

+0

Jestem zdziwiony, dlaczego takie pytanie spowodowałoby tak wiele awansów w krótkim czasie ... czy to dlatego, że jest otagowane JavaScript i czy zachowanie nie jest od razu oczywiste ...? – Lekensteyn

+10

Dowód na to, że powinieneś wstawiać średniki = D – Esailija

+0

tak, czasami te półrocza mają znaczenie, a my możemy zobaczyć, jak to może się stać, gdy to robią i nie ma ich! lekcja: zawsze używaj semis. – dandavis

Odpowiedz

22

Brakuje ; po przypisaniu funkcji do a.X.

Wprowadzanie półkolumn jest , a nie wyzwalane.

Do anonimowej funkcji używane są funkcje ( i ) w celu wywołania poprzedniej funkcji, a jej wartość zwracana jest przypisywana do X.

to co masz jest równoważne:

var a = {}; 

a.X = (function x(){ 
    console.log("shouldn't be executed"); 
}(
    (function(a){ 
     console.log("self execution"); 
    }(a)) 
)); 

Nawiasem mówiąc, ten problem jest dobra reklama dla JS Lint, który byłby podniósł go.

+2

LOL Właśnie zauważyłem to. Dlatego ** powinieneś użyć ** średników! – Neal

+0

@asawyer - Naprawiono zbyt daleko przed tym, co pisałem. – Quentin

+0

Ha, niesamowite. Dzięki. Również to ma sens, dlaczego działa, gdy ładuję wiele plików, nie mają one możliwości wykonywania siebie nawzajem w ten sposób. Kiedy połączyłem wszystko w jeden plik, nagle liczyły się średniki. – devshorts

3

to mieć coś wspólnego z wtryskiem średnik bo kiedy umieścić średnik to działa zgodnie z oczekiwaniami:

var a = {} 

    a.X = function x(){ 
     console.log("shouldn't be executed"); 
    }; // added semicolon 

    (function(a){ 
     console.log("self execution"); 
    }(a)); 
1

Nie odebrano średnik ; po swoją a.X = function x() { ...} ;

tj

a.X = function x(){ 
    console.log("shouldn't be executed"); 
}; 
Powiązane problemy