嵌套函数和闭包
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
函数执行完毕后,执行上下文消失,x
和 bar
被垃圾收集。
简而言之,通过闭包,外部函数执行上下文的内部状态得到保留,但对于嵌套函数,外部函数的执行上下文消失,创建的变量和函数被垃圾收集。
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
函数执行完毕后,执行上下文消失,x
和 bar
被垃圾收集。
简而言之,通过闭包,外部函数执行上下文的内部状态得到保留,但对于嵌套函数,外部函数的执行上下文消失,创建的变量和函数被垃圾收集。