Kiedy chcę używać stosunkowo nowej metody w JavaScript, powiedzmy history.pushState, powinienem sprawdzić, czy jest naprawdę dostępny, zanim zadzwonię. Dowiedziałem się, że ludzie używają wielu różnych metod, aby sprawdzić dostępność metody i korzystałem z własnego prostego sposobu, który działał dla mnie w każdym przypadku. W każdym razie nadal nie jestem pewien, jeśli moja metoda jest całkowicie zebrana i szeroko kompatybilna, ponieważ excesive wykorzystanie mniej wygodnego sposobu myślenia, co jest prawdziwy powód, dla którego ludzie używają tego zamiast prosty sposób.

Spodziewam się, że odpowiedź mówiąc, że moja metoda jest również całkowicie w porządku, lub wyjaśniająca, w której scenariusze moja metoda może zawieść, więc nie jest dobrze jej używać.

Używam tego sposobu:

history.pushState && history.pushState('?attr');

Po prostu z powodu wczesnego odrzucenia stanu, jeśli popadanie nie istnieje, nie zostanie wywołany. Działa na wszystkich sposobach, które próbowałem i bez żadnego ostrzeżenia.

Inne, mniej wygodne sposoby, znalazłem, że ludzie używają (w if):

  1. typeof(history.pushState) == 'function'
  2. typeof history.pushState !== 'undefined'
  3. "pushState" in history
  4. typeof(history.pushState) === typeof(Function)

Moja opinia

Moim zdaniem w JavaScript jest całkowicie dobra, aby sprawdzić dostępność zmiennej lub nazwy mojego if (anythingUndefined) {}. Oczywiście może być fałszywy negatywny, gdy zmienna ma 0, false, null itp., Ale to nie jest punkt mojego pytania, ponieważ metoda testowania lub obiekt ten zawsze równa się prawdziwy.

1
micropro.cz 24 czerwiec 2017, 03:45

3 odpowiedzi

Najlepsza odpowiedź

Całkowicie dobrze jest użyć "prostego" sposobu, w jaki opisano, aby sprawdzić, czy funkcja istnieje przed wywołaniem go, powodem, dla którego ludzie wybierają inne sposoby, jest głównie dlatego, że są bardziej czytelne dla non JavaScript "Eksperci" i jeśli używasz narzędzi jak jslint za pomocą konfiguracji stylu kodowania, rzuciłoby Ci ostrzeżenie, gdy używasz x && x(), ponieważ jest to tylko złym stylem kodowania dla niektórych osób lub firmy, która ma "kontrakt w stylu kodowania", który ma "umowę w stylu kodowania" każdy deweloper musi zastosować.

P.S Moje ulubione sposoby to:

 if(typeof history.pushState === 'function') {
     history.pushState('?attr');
 }

 // or if you don't like that much strings inside your code
 if(typeof history.pushState === typeof Function) {
     history.pushState('?attr');
 }
0
cyr_x 24 czerwiec 2017, 01:00

Twoja metoda zawiedzie ...

  • Jeśli ktoś używasz (jakiś kod używasz) nadpisuje history.pushState za pomocą wartości prawdą, która nie jest funkcją

  • lub jeśli ktoś nadpisuje history

  • lub jeśli masz zmienną o nazwie history zdefiniowany, który nie odnosi się do globalnego obiektu historii

Jeśli możesz wykluczyć te źródła błędu, twoja metoda działa dobrze.

Ale jeśli musisz użyć pushState() w więcej niż jednym miejscu, zapisz metodę pewnej zmiennej i sprawdź koncepcję obiektów NULL.

var pushState = history && typeof history.pushState === "function"?
    history.pushState.bind(history):
    function(){};

I używaj go jako

pushState('?attr');

Wether history.pushState() istnieje czy nie

0
Thomas 24 czerwiec 2017, 01:09

Jeśli spojrzysz na Ta odpowiedź wyjaśnia większość czego szukasz. Sprawdzanie słów kluczowych in Jeśli obiekt ma właściwość niezależnie od tego, że kiedykolwiek został ustawiony. Jeśli spojrzysz na niektóre z nowoczesnych samouczków technologii JavaScript, które wydaje się być preferowanym sposobem. Na przykład tutaj jest samouczek Google na Pracownicy usług który używa tej składni do sprawdzania.

0
user8086575user8086575 24 czerwiec 2017, 00:58