JavaScript的“闭包”到底是什么
2014-08-26 15:08
267 查看
在JavaScripot函数闭包的定义中,一般都有一个outer 函数,一个inner函数。那么“闭包”到底是指outer函数呢,还是指inner函数?
从官方定义来看,并不清楚:A closure is a combination of a code block and data of a context in which this code block is created.
那么在下列函数中:
function outerfunc(y) {
var internal1 = 100 ;
var internal2 = 200 ;
function innerfunc1(x) {
internal1++;
internal2 --;
}
function innerfunc2()
{
internal1--;
internal2++;
}
function get1()
{
return internal1;
}
function get2()
{
return internal2;
}
y.func1 = innerfunc1;
y.func2 = innerfunc2;
y.get1 = get1;
y.get2 = get2;
}
到底是哪个函数闭包那个呢?是outerfunc闭包innerFunc1, innerfunc2呢?还是相反?
一般的教科书认为是innerfunc1 闭包了internal1和internal2。同样innerfunc2闭包了上述两个变量。这也不违反上述官方定义,只是总觉得在“语义”层面说不过去。看过我C++博客的读者会知道我对语义的痴迷。
我认为,正确的理解应该是outerfunc, innerfunc1, innerfunc2,get1,get2共同组成一个闭包,包揽了outerfunc的所有自由变量,参数, 以及local变量。
为什么呢?因为:
1) innerfunc1 和innerfunc2 都“定义”在outerfunc内,共享outerfunc的自由变量internal1和internal2。单独谈哪一个函数都没有意义。
2) 因为有了innerfunc1和innerfunc2,outerfunc的“语义”发生了根本的变化。本来是“auto”变量的internal1和internal2变成了“heap”变量。具体的实现是JavaScript的implementation细节。但是懂得这一微妙的细节,会加深你对JavaScript的理解。也知道closure的实现代价。
3) 上面这条的详细解读:没有闭包的outerfunc可以优化,利用stack变量来实现internal1和internal2。有了闭包,internal1和internal2必须由Garbage collection 来实现。功能当然会大幅下降。
以上第二点,对理解“闭包”,以及JavaScript函数的性质,有根本意义。
2014-8-26 西雅图
从官方定义来看,并不清楚:A closure is a combination of a code block and data of a context in which this code block is created.
那么在下列函数中:
function outerfunc(y) {
var internal1 = 100 ;
var internal2 = 200 ;
function innerfunc1(x) {
internal1++;
internal2 --;
}
function innerfunc2()
{
internal1--;
internal2++;
}
function get1()
{
return internal1;
}
function get2()
{
return internal2;
}
y.func1 = innerfunc1;
y.func2 = innerfunc2;
y.get1 = get1;
y.get2 = get2;
}
到底是哪个函数闭包那个呢?是outerfunc闭包innerFunc1, innerfunc2呢?还是相反?
一般的教科书认为是innerfunc1 闭包了internal1和internal2。同样innerfunc2闭包了上述两个变量。这也不违反上述官方定义,只是总觉得在“语义”层面说不过去。看过我C++博客的读者会知道我对语义的痴迷。
我认为,正确的理解应该是outerfunc, innerfunc1, innerfunc2,get1,get2共同组成一个闭包,包揽了outerfunc的所有自由变量,参数, 以及local变量。
为什么呢?因为:
1) innerfunc1 和innerfunc2 都“定义”在outerfunc内,共享outerfunc的自由变量internal1和internal2。单独谈哪一个函数都没有意义。
2) 因为有了innerfunc1和innerfunc2,outerfunc的“语义”发生了根本的变化。本来是“auto”变量的internal1和internal2变成了“heap”变量。具体的实现是JavaScript的implementation细节。但是懂得这一微妙的细节,会加深你对JavaScript的理解。也知道closure的实现代价。
3) 上面这条的详细解读:没有闭包的outerfunc可以优化,利用stack变量来实现internal1和internal2。有了闭包,internal1和internal2必须由Garbage collection 来实现。功能当然会大幅下降。
以上第二点,对理解“闭包”,以及JavaScript函数的性质,有根本意义。
2014-8-26 西雅图
相关文章推荐
- 深入理解JavaScript - 闭包 (一)到底什么才是闭包
- JavaScript的闭包到底是什么
- JavaScript的“闭包”到底是什么(2)
- JavaScript 闭包究竟是什么
- 深入理解JavaScript 闭包究竟是什么
- javascript的闭包是什么意思 有什么用
- javascript中的this到底指什么?
- 在Javascript中,什么是闭包
- JavaScript之this到底指什么
- JavaScript 闭包究竟是什么
- 在Javascript中,什么是闭包(Closure)
- JavaScript 闭包究竟是什么
- Javascript到底能做什么?
- JavaScript 从闭包可以做什么开始,将有助于理解闭包
- javascript:void到底是个什么?
- 深入理解JavaScript 闭包究竟是什么
- 在Javascript中,什么是闭包(Closure)
- 在Javascript中,什么是闭包(Closure)
- 我的JavaScript之旅——“闭包”是什么时候创建的
- 深入理解什么是javascript中的闭包(转载)