嵌套函数和闭包

Nested Function and Closures

JavaScript 中的嵌套函数和闭包有什么区别或两者相同?有什么功能上的区别吗?

有区别。当内部函数在其词法范围之外返回但仍保持与其词法环境的连接时,就会观察到闭包。看看下面的例子。

function addOne() {
  var x = 1;
   function bar() {
    console.log(++x);
  }
 return bar;
}

var adder = addOne();
adder(); // 2
adder(); // 3
adder(); // 4

从上面,我们可以看到 addOne() 被调用,它 returns 函数 bar 存储在加法器中。通常你会期望 addOne() 调用的内部状态(执行上下文的变量环境)会被垃圾收集,但是,因为在外部有一个对 bar 函数的引用,[=12 的内部状态=] 呼叫被保留。当调用加法器时,由于关闭,它会更新 var x

function addOne() {
  var x = 1;
   function bar() {
    console.log(++x);
  }
  bar();
}

var adder = addOne(); // 2
adder() // Uncaught TypeError: adder is not a function

在上面的代码中,函数bar只是嵌套在函数addOne的内部。当函数 addOne 被调用时,一个执行上下文被创建,它创建了 var x 和函数 bar。当调用 bar 时,由于词法作用域,它能够更新 x 的值。 addOne 函数执行完毕后,执行上下文消失,xbar 被垃圾收集。

简而言之,通过闭包,外部函数执行上下文的内部状态得到保留,但对于嵌套函数,外部函数的执行上下文消失,创建的变量和函数被垃圾收集。