== Why is this an issue?

Nested code blocks can be used to create a new scope: variables declared within that block cannot be accessed from the outside,
and their lifetime end at the end of the block. However, this only happens when you use ES6 `let` or `const` keywords,
a class declaration or a function declaration (in strict mode). Otherwise, the nested block is redundant and should be removed.

=== Exceptions

The rule does not apply to the following cases:

* Block statements containing variable declarations using `let` or `const` keywords or class declarations are not redundant as they create a new scope.

[source,javascript]
----
{
    let x = 1;
}
----

* The same applies to function declarations in https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode[strict mode]

[source,javascript]
----
"use strict";
{
    function foo() {}
}
----

* The rule also does not apply to the blocks that are part of the https://developer.mozilla.org/en-US/docs/Glossary/Control_flow[control flow].

[source,javascript]
----
if (condition) {
    doSomething();
}
----

== How to fix it

The nested code blocks should be extracted into separate methods.

=== Code examples

==== Noncompliant code example

[source,javascript,diff-id=1,diff-type=noncompliant]
----
{   // Noncompliant: redundant code block
    var foo = bar();
}

if (condition) {
    doSomething();
    {   // Noncompliant: redundant code block
        doOtherStuff();
    }
}
----

==== Compliant solution

[source,javascript,diff-id=1,diff-type=compliant]
----
var foo = bar();

if (condition) {
    doSomething();
    doOtherStuff();
}
----

== Resources

=== Documentation
* Wikipedia - https://en.wikipedia.org/wiki/Single-responsibility_principle[Single Responsibility Principle]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block[block statement]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var[var]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let[let]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const[const]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/class[class declaration]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function[function declaration]
* MDN web docs -  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode[strict mode]