2011-01-31 10 views
5

Podczas pisania kodu tak jsLint narzeka implikowanych globalnych:Unikanie Implied globalnych w javascript (JSlint)

var Test = (function(){ 
    var fnc = function(x){ 
     alert("pew: "+x); 
    }; 

    return { 
     fnc: fnc 
    }; 
}()); 

Test.fnc("hat"); 

(konkretnie 'dorozumianą globalny: alert 4')

Co jest uważany za prawidłowy sposób uniknąć tego? Moja instynktowna reakcja jest to, ale nie jestem przekonany, że to jest „poprawny”:

var Test2 = (function(global){ 
    var alert = global.alert; 

    var fnc = function(x){ 
     alert("pew: "+x); 
    }; 

    return { 
     fnc: fnc 
    }; 
}(this)); 

Test2.fnc("hat"); 

Edit: Konsensus wydaje się, że problemem nie jest fakt, że mam dostęp do globalnej, to więcej, że nie mówię jslintowi, czym są globale. Zostawię to otwarte nieco dłużej, aby sprawdzić, czy ktoś inny ma dane wejściowe, wtedy wybiorę odpowiedź.

Odpowiedz

8

można poprzedzić plik z komentarzem

/*global alert $ document window*/

ogół jest to jak mówię JSLint że nie wynikało, ale zewnętrzny.

To jest zarówno dyskretne, jak i mówiąc innym programistom, że deklarujesz te zmienne jako zewnętrzne, co jest przydatne w większych programach wieloplikowych.

+2

IIRC czy deklaracje nazw zmiennych nie muszą być rozdzielane przecinkami? –

+0

@ZackTheHuman tam przestrzeń oddzielona. Okazuje się, że JSLint mówi, że przecinek jest oddzielony. Zawsze używałem oddzielonej spacjami listy bez błędów. Prawdopodobnie obsługuje zarówno – Raynos

+0

Uwaga, nie powinno być spacji między początkiem komentarza a "globalnym", w przeciwnym razie jslint go nie przetwarza. – oyenamit

0

Myślę, że droga jest prawidłowa (i dobre), ale nie ma potrzeby deklarowania global.alert, wystarczy użyć global.alert("pew: "+x);

+0

'var alert = global.alert' jest tak naprawdę dla wygody, więc zachowuje się tak samo, jak wtedy, gdy właśnie opuściłem błąd. – david

+0

Nie widzę żadnej wygody przy korzystaniu z niego. Ale niezależnie od tej części, myślę, że twoje rozwiązanie jest nie tylko poprawne, ale i dobre. –

1

dla osób poszukujących JSHint zamiast tego istnieje opcja „przeglądarka”, która może być ustawiona do "true" i obsługuje wszystkie popularne globale. To samo dotyczy "jquery". Nauczyłem się tego od gradle-js-plugin source code.