2015-08-26 128 views
1
function makeCounter() { 
    var i = 0; 
    return function() { 
     console.log(++i); 
    }; 
} 

var counter = makeCounter(); 
counter(); // logs: 1 
counter(); // logs: 2 

为什么第二次调用counter()的结果是'2'而不是'1'?为什么调用两次函数的结果不同?

我试图找出它的执行过程,所以我改写makeCounter()

function makeCounter() { 
    var i = 0; 
    console.log('outer'); 
    return function() { 
     console.log('inner'); 
     console.log(++i); 
    }; 
} 

var counter = makeCounter(); 
counter(); 
counter(); 

和结果是:

outer 
inner 
1 
inner 
2 

我能想到的是: 是功能计数器的参数(),第一个计数器() ex已完成,i更改为'1'。所以第二个计数器()执行,是'2'。

+6

它被称为闭包变量 –

+2

counter'的'所有的电话将参考i'的'同一个实例,当该值在更新'counter'将更新共享实例值 –

+0

谢谢〜我可以理解什么是闭包,但这个例子中的变量'i'令我困惑。需要更多的学习和培训。谢谢〜 –

回答

1

正如在评论中提到的那样,这是JavaScript中所谓的closure的效果。要充分认识它,我会建议你从下面的报价是拍摄地点看看How do JavaScript closures work

在JavaScript中,如果在其他函数内声明的函数,则局部变量可以在回国后仍可以访问你调用的函数。

在你的情况下,在makeCounter函数中声明一个匿名函数,创建一个闭包(它会“记住”当时所有的局部变量)。即使makeCounter已退出,匿名功能仍将能够访问变量i。因此,每次调用匿名函数都会增加与变量相同的i

function makeCounter() { 
    var i = 0; 
    return function() { 
     console.log(++i); // Will always use the same variable "i" 
    }; 
} 

var counter = makeCounter(); 
counter(); // logs: 1 
counter(); // logs: 2 
相关问题