Patrząc na wszystkie informacje na temat JSNInt (np. Tutaj lub Oto), dyskusja idzie coś takiego

Zawsze używaj trybu ścisłego, ponieważ łapie wiele innych błędów. Wszystko, co musisz zrobić, to umieścić "Używaj ścisłego" na górze swojego kodu. Otóż to! Nie można było łatwiej ... z wyjątkiem sytuacji, gdy JSNTING narzeka i informuje, że umieścisz go w zakresie funkcji, musisz umieścić cały swój kod wewnątrz funkcji gigantycznej.

Mam setki funkcji napisanych w JavaScript i przy minimalnym <body> wywołuje funkcję zwrotną na obciążeniu, więc próbuję owinąć głowę wokół, jak mam umieścić wszystkie moje funkcje w innej funkcji, ale nadal zapewniają, że <body> Element może nadal Pierce funkcja zewnętrzna i zadzwoń do moich funkcji z zakresem wewnętrznym.

Czy ktoś może mi powiedzieć, jak wdrożyłbym ścisły tryb na coś takiego

function foo(){
    "use strict"; /* Approach 1: Putting inside every function */
                  /* Extremely tedious and ugly */
    $('#example').text('Hello '+ bar());
}

function bar(){
    "use strict"; /* Approach 1: Putting inside every function */
                  /* Extremely tedious and ugly */
    return 'Beautiful';
}

function fooBar (){
    "use strict"; /* Approach 2: Putting once at the top of an outer function */
    
    /* But now how does <body> call this function? */
    function foo(){
        "use strict";
        $('#example').text('Hello '+ bar());
    }

    function bar(){
        "use strict";
        return 'Beautiful';
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body onload="foo();">
<p id='example'>
</p>
</body>
1
puk 14 marzec 2021, 06:11

2 odpowiedzi

Najlepsza odpowiedź

W nowoczesnym JavaScript, podręczniki inline należy unikać, gdy tylko jest to możliwe, ponieważ wymagają one globalnego zanieczyszczenia, wymagają brzydkiego cytatu ucieczki z niektórymi argumentami i mają absurdalne zasady łańcucha zakresu. Więc spróbuj usunąć ładowarki inline i umieścić JavaScript do iife, który może być rygorystyczny:

(() => {
  "use strict";

  function foo() {
    $('#example').text('Hello ' + bar());
  }

  function bar() {
    return 'Beautiful';
  }
  window.addEventListener('DOMContentLoaded', foo);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<body>
  <p id='example'>
  </p>
</body>

Jeśli masz jakieś inne linie ręczne podobne do <body onload="foo();">, bardzo polecam ich refaktoryzacja.

2
CertainPerformance 14 marzec 2021, 03:14

Chociaż odpowiedź zbiorowemu jest IMO najlepszy tutaj, nadal chciałem odpowiedzieć na moje pytanie w kontekście tego, co I oznaczało , być może nie, jak dokładnie to sformułowałem.

Niektóre języki programowania nie troszczą się zbytnio o scoping (patrzę na ciebie python), ale większość dojrzałych, z C ++ jest najsilniejszy, zapewnić jakąś formę scoping

/* Begin Pseudocode */
include <a>;             /* Include some external library */
external var external_a; /* Indicate that it is defined externally */
var global_a;            /* Create global scope variable */

function xyz (p_1, p_2); /* Declare global scope function */

function xyz (p_1, p_2){ /* Define function */
    return p_1 * external_a + p_2 * global_a; /* Example calculation */
}

JavaScript nie jest tak naprawdę eksportu, więc musisz umieścić to wszystko w funkcji i zwrócić obiekt w klasie i hack , aby uzyskać poczucie prywatnego vs publicznego, nieco tak jak więc

(() =>{
    var global_a; /* Global function scope */
    let xyz;      /* Declare function */

    xyz = function  (p_1, p_2){ /* Define function */
        return p_1 * p_2; /* Example calculation */
    };

    return { /* Finally, we have to manually return the function */
             /* designating it as public in the process */
        xyz: xyz
    };
}(external_a); /* passed externally, essentially making it a global */

Muszę refaktoryzację KODEBASE w takim bizzare sposób, zwykle jest czerwona flaga biednego języka programowania, w którym zasadniczo włamujesz składnię, aby uzyskać funkcjonalność, którą chcesz, zamieniając się w kompilator quasi w procesie, ale mam inny problem Dzięki temu podejściu: prowadzi do złych praktyk programowania, takich jak zdefiniowane zmienne, ale nigdy nie używane. Jeśli uruchomisz powyższy kod JavaScript przez JShint, narzeknie, narzeka, że xyz is defined but never used. Technicznie jest właściwe, ale to jest cała istota wszystkich apis: pisać raz, użyj później ... może . Następnie prowadzi do całości wyprawy królika do wyprawy próbując stłumić niektóre błędy jshint (jak {x1}}}, ale nigdy nie używane), nie tłumując innych (jak a być zdefiniowane, ale nigdy nie używane). Może istnieć sposób, aby skonfigurować JShint, aby rozpoznać ten specjalny przypadek, ale moim punktem jest to, że powinno być pojedynczy czysty sposób, aby osiągnąć ten wynik, a JStint należy skonfigurować tylko do tego podejścia.

Teraz JavaScript Technicznie Czy Masz funkcję eksportową i może być używany tak, ale dla mnie silny język powinien utworzyć moduł oparty na pliku, a nie oparty na pliku zmodyfikowana wersja tego pliku, a ponadto ten moduł powinien być importowany nie eksportowany

var module_a = (() =>{
    var global_a; /* function scope */
    let xyz;      /* Declare function */

    xyz = function  (p_1, p_2){ /* Define function */
        return p_1 * p_2; /* Example calculation */
    };

    return {
        xyz: xyz
    };
}(external_a); /* passed externally */

export module_a;

Myślę, że to, co próbuję powiedzieć, a ja czuję, że zamierzam dostać wiele wypychania tego z tej społeczności, jest to, że JavaScript chce być językiem OO z zaawansowanymi funkcjami, ale włamanie go do zrobienia jednej rzeczy słabość, która następnie musi zostać ponownie zhakowana. Niepowodzenie społeczności internetowej JavaScript do radzenia sobie z tymi niedociągnięciami prowadzi do detatched-from-rzeczywistość samouczki online, takich jak ta (Źródło)

[A] Moduł [A] jest samodzielny i wielokrotnego użytku kawałek kodu JavaScript napisany w sposób modułowy. Do ES6 JavaScript nie zdefiniował żadnego konstruktu językowego do pracy z modułami. Tak więc pisanie modułowego JavaScript obejmuje użycie pewnej konwencji kodującej.

Teraz jest to jeden z bardziej uczciwych samouczków, ale Konwencja kodująca wydaje się trochę podlewana i wykastrowana dla mojego gustu. Zasadniczo, co mówi autor, że nie ma czystego sposobu, aby to zrobić, więc niestety musisz go włamać.

Więc moja długotrwała odpowiedź na moje pierwotne pytanie brzmi: musisz wziąć całą całą firmę CODEBASE, który był cały globalny zakres i łatwy w użyciu interfejs API i umieścić go w anonimowej funkcji, a następnie przyklej "use strict"; w TOP, więc JSHINT działa, a potem dowolne punkty lotnicze API, musisz udostępnić publicznie, aby powrócić do olbrzymiego obiektu, a następnie, gdy JShint skarży się o zadeklarowane zmienne, ale nie używane, przyklejasz tam /* jshint line: ignore */ komentarz, a następnie usuń tam komentarz Jeśli i gdy okaże się, że nie działa (najprawdopodobniej przestarzały), więc wyłącz to, że wyjście z otaczającą nieużywane zmienne części z ({x2}} ... /*jshint unused: true */), a następnie na końcu swojej strony Eksportuj swoje Zwrócił obiekt i zaimportuj go gdzieś indziej i użyj go.

0
puk 14 marzec 2021, 19:59