2015-07-02 26 views
6

Jestem nowy w programowaniu javascript (i ogólnie języków skryptowych), ale używam JS Lint, aby mi pomóc, gdy popełniam błędy składniowe lub przypadkowo zadeklaruję zmienną globalną.Czy mogę zapobiec przekazywaniu nieprawidłowej liczby parametrów metodom JS Lint, JS Hint lub innym narzędziem?

Istnieje jednak scenariusz, którego JS Lint nie uwzględnia, co moim zdaniem byłoby niezwykle przydatne. Zobacz poniższy kod:

(function() { 
    "use strict"; 
    /*global alert */ 

    var testFunction = function (someMessage) { 
     alert("stuff is happening: " + someMessage); 
    }; 

    testFunction(1, 2); 
    testFunction(); 
}()); 

Zauważ, że jestem przechodzącej niewłaściwą liczbę parametrów testFunction. Nie przewiduję, że kiedykolwiek zdarzy mi się, że celowo pominę parametr lub dodaję taki dodatkowy. Jednak ani JS Lint, ani JS Hint nie uważają tego za błąd.

Czy jest jakieś inne narzędzie, które złapie to dla mnie? Czy jest jakiś powód, dla którego przekazywanie takich parametrów nie powinno być sprawdzane?

+0

Czy jest to blisko tego, o co pytasz? https://jslinterrors.com/this-function-has-too-many-parameters –

+0

Nie.To wydaje się być ograniczeniem liczby parametrów, jakie może pełnić funkcja. Nie dbam szczególnie o to, czy funkcja ma 2 czy 7 parametrów. Po prostu nie chcę wywoływać funkcji, która ma 2 parametry z wywoływaniem, które przechodzi w 7. – tandersen

+0

Ah, więc chcesz ogólne rozwiązanie inne niż oznaczanie każdej funkcji z niestandardową wartością jak min = 3 i max = 3 dla 3 -parametr funkcji. Nie widzę takiej reguły lint. –

Odpowiedz

3

Nie jest to ogólnie możliwe z żadnym narzędziem do analizy statycznej. Istnieje kilka przyczyn:

  • Zasadniczo funkcje JS mogą przyjmować dowolną liczbę argumentów.
  • Większość (wszystkie?) Linters działa tylko na jednym pliku na raz. Nie wiedzą nic o funkcjach zadeklarowanych w innych plikach.
  • Nie ma gwarancji, że właściwość wywoływana jako funkcja jest funkcją, której można się spodziewać. Rozważmy następujący fragment:

    var obj = { myFunc : function(a,b) { ... } }; 
    var doSomething(x) { x.myFunc = function(a) { ... }; }; 
    doSomething(obj); 
    obj.myFunc(); 
    

Nie ma sposobu, aby wiedzieć, że myFunc teraz ma inną liczbę args po wywołaniu doSomething.

JavaScript jest dynamicznym językiem i należy go zaakceptować i zaakceptować.

Zamiast polegać na lintach, aby złapać problemy, do których nie był przeznaczony, zaleciłbym dodanie warunków wstępnych do funkcji, które sprawdzają.

Tworzenie funkcji pomocnika tak:

function checkThat(expression, message) { 
    if (!expression) { 
    throw new Error(message); 
    } 
} 

następnie używać go tak:

function myFunc(a, b) { 
    checkThat(arguments.length === 2, "Wrong number of arguments."); 

I z właściwą testów jednostkowych, nigdy nie powinien zobaczyć ten komunikat o błędzie w produkcji.

1

To nie jest natywnie możliwe w javascript. Trzeba by zrobić coś takiego:

var testFunction = function (someMessage) { 
    var args = Array.prototype.slice.call(arguments); 
    if (args.length !== 1) throw new Error ("Wrong number of arguments"); 
    if (typeof args[1] !== string) throw new Error ("Must pass a string"); 
    // continue 
}; 
0

Paul Irish demoed hack za to jakiś czas temu ... przechodząc undefined pod koniec parametrów ...

var testFunction = function (someMessage, undefined) { 
    alert("stuff is happening: " + someMessage); 
}; 

On demos go here ... zobacz, czy to jest to, czego szukasz.