• Wrap immediately invoked function expressions in parentheses. eslint: wrap-iife

    1. // immediately-invoked function expression (IIFE)
    2. (function () {
    3. console.log('Welcome to the Internet. Please follow me.');
    4. }());

  • Never declare a function in a non-function block (if, while, etc). Assign the function to a variable instead. Browsers will allow you to do it, but they all interpret it differently, which is bad news bears. eslint: no-loop-func

  • Note: ECMA-262 defines a block as a list of statements. A function declaration is not a statement.

    1. // bad
    2. if (currentUser) {
    3. function test() {
    4. console.log('Nope.');
    5. }
    6. }
    7. // good
    8. let test;
    9. if (currentUser) {
    10. test = () => {
    11. console.log('Yup.');
    12. };
    13. }

  • 7.5 Never name a parameter arguments. This will take precedence over the arguments object that is given to every function scope.

    1. // bad
    2. function foo(name, options, arguments) {
    3. // ...
    4. }
    5. // good
    6. function foo(name, options, args) {
    7. // ...
    8. }

  • Why? ... is explicit about which arguments you want pulled. Plus, rest arguments are a real Array, and not merely Array-like like arguments.

  • Use default parameter syntax rather than mutating function arguments.

    1. // really bad
    2. function handleThings(opts) {
    3. // No! We shouldn’t mutate function arguments.
    4. // Double bad: if opts is falsy it'll be set to an object which may
    5. // be what you want but it can introduce subtle bugs.
    6. opts = opts || {};
    7. // ...
    8. }
    9. // still bad
    10. function handleThings(opts) {
    11. opts = {};
    12. }
    13. }
    14. // good
    15. function handleThings(opts = {}) {
    16. // ...
    17. }

  • 7.8 Avoid side effects with default parameters.

    1. var b = 1;
    2. // bad
    3. function count(a = b++) {
    4. console.log(a);
    5. }
    6. count(); // 1
    7. count(); // 2
    8. count(3); // 3
    9. count(); // 3

  • Always put default parameters last.

    1. // bad
    2. function handleThings(opts = {}, name) {
    3. // ...
    4. }
    5. // good
    6. function handleThings(name, opts = {}) {
    7. // ...
    8. }

  • 7.10 Never use the Function constructor to create a new function. eslint:

    Why? Creating a function in this way evaluates a string similarly to eval(), which opens vulnerabilities.

    1. // bad
    2. const f = function(){};
    3. const g = function (){};
    4. const h = function() {};
    5. // good
    6. const x = function () {};
    7. const y = function a() {};

  • 7.12 Never mutate parameters. eslint:

    Why? Manipulating objects passed in as parameters can cause unwanted variable side effects in the original caller.

    1. // bad
    2. function f1(obj) {
    3. obj.key = 1;
    4. }
    5. // good
    6. function f2(obj) {
    7. const key = Object.prototype.hasOwnProperty.call(obj, 'key') ? obj.key : 1;
    8. }

  • 7.13 Never reassign parameters. eslint:

    1. function f1(a) {
    2. a = 1;
    3. // ...
    4. }
    5. function f2(a) {
    6. if (!a) { a = 1; }
    7. // ...
    8. }
    9. // good
    10. function f3(a) {
    11. const b = a || 1;
    12. // ...
    13. }
    14. function f4(a = 1) {
    15. // ...
    16. }

  • 7.14 Prefer the use of the spread operator ... to call variadic functions. eslint:

    Why? It’s cleaner, you don’t need to supply a context, and you can not easily compose new with apply.

  • Functions with multiline signatures, or invocations, should be indented just like every other multiline list in this guide: with each item on a line by itself, with a trailing comma on the last item. eslint: function-paren-newline

    1. // bad
    2. function foo(bar,
    3. baz,
    4. quux) {
    5. // ...
    6. }
    7. // good
    8. function foo(
    9. bar,
    10. baz,
    11. quux,
    12. ) {
    13. // ...
    14. }
    15. // bad
    16. console.log(foo,
    17. bar,
    18. baz);
    19. // good
    20. console.log(
    21. foo,
    22. bar,