Skip to content

unicorn/consistent-function-scoping Suspicious

🚧 An auto-fix is still under development.

What it does

Disallow functions that are declared in a scope which does not capture any variables from the outer scope.

Why is this bad?

Moving function declarations to the highest possible scope improves readability, directly improves performance and allows JavaScript engines to better optimize your performance.

Examples

Examples of incorrect code for this rule:

js
export function doFoo(foo) {
  // Does not capture anything from the scope, can be moved to the outer scope
  function doBar(bar) {
    return bar === "bar";
  }
  return doBar;
}
function doFoo(foo) {
  const doBar = (bar) => {
    return bar === "bar";
  };
}

Examples of correct code for this rule:

js
function doBar(bar) {
  return bar === "bar";
}

export function doFoo(foo) {
  return doBar;
}

export function doFoo(foo) {
  function doBar(bar) {
    return bar === "bar" && foo.doBar(bar);
  }

  return doBar;
}

Options

checkArrowFunctions

Type: boolean
Default: true

Pass "checkArrowFunctions": false to disable linting of arrow functions.

Limitations

This rule does not detect or remove extraneous code blocks inside of functions:

js
function doFoo(foo) {
  {
    function doBar(bar) {
      return bar;
    }
  }

  return foo;
}

It also ignores functions that contain JSXElement references:

jsx
function doFoo(FooComponent) {
  function Bar() {
    return <FooComponent />;
  }

  return Bar;
}

Immediately invoked function expressions (IIFE) are ignored:

js
(function () {
  function doFoo(bar) {
    return bar;
  }
})();

References

Released under the MIT License.