Javascript 为什么需要在此闭包中创建变量
嗨,我有以下的结尾Javascript 为什么需要在此闭包中创建变量,javascript,function,variables,closures,Javascript,Function,Variables,Closures,嗨,我有以下的结尾 function createCounter() { var numberOfCalls = 0; return function() { return ++numberOfCalls; } } var fn = createCounter(); fn() fn() 我相信我理解了作用域和这样一个事实,即内部函数在外部函数返回后保留外部函数的值 我不明白的是为什么我需要创建这个变量 var f
function createCounter() {
var numberOfCalls = 0;
return function() {
return ++numberOfCalls;
}
}
var fn = createCounter();
fn()
fn()
我相信我理解了作用域和这样一个事实,即内部函数在外部函数返回后保留外部函数的值
我不明白的是为什么我需要创建这个变量
var fn = createCounter()
然后调用变量fn()
,而不是最初调用createCounter()
我看到createCounter()只返回“function()”而不是必须返回的“1”,我不明白为什么
谢谢你的帮助。阅读了很多教程,但仍然无法理解这一点
请注意:问题不在于如何使代码更加雄辩或更好,而在于理解所做的工作调用
createCounter
时,它会返回另一个函数,除非您这样做,否则不会计算返回的函数。记住,在JavaScript中,函数也是对象。它们可以是函数的返回值
所以当你这样做的时候:
var fn = createCounter();
fn
只引用createCounter
函数返回的函数,而不引用其计算值
如果需要计算createCounter
返回的函数,请尝试以下操作:
createCounter()();
这将计算返回的函数
如果您这样调用它,它将始终返回与创建新的
numberOfCalls
变量相同的值。在Javascript中,每次调用createCounter
时,函数都是可以传递给其他函数并由其他函数返回的对象,就像任何其他对象一样(例如字符串、数字…)
这样做:
function foo(arg) { /* ... */ }
var someObject = new String("Hello");
foo(someObject);
类似于:
function foo(arg) { /* ... */ }
var someFunction = new Function("Hello", "...");
foo(someFunction);
因此,一个函数可能返回另一个函数,可以根据需要调用该函数
function foo() {
return new Function(...);
}
var functionReturnedByCallingFoo = foo();
functionReturnedByCallingFoo(); // can be invoked
functionReturnedByCallingFoo(); // and again
functionReturnedByCallingFoo(); // and again
现在,函数几乎从不使用函数构造函数来声明,而是使用名为“函数声明”或“函数表达式”的构造-基本上,就像我们在前面的示例中定义函数“foo”的方式,函数签名和函数体由花括号分隔
在这种情况下,函数体内部的语句可以读取和写入函数本身外部声明的变量(“自由变量”),而不仅仅是函数内部声明的变量,这符合词汇作用域规则。这就是我们所说的结束
因此,在您的例子中,createCounter()函数在被调用时,定义了一个名为“numberOfCalls”的局部变量,然后返回一个函数,该函数的主体可以访问该变量。执行返回的函数会在每次调用时更改变量的值,就像对任何“全局”变量(即在外部作用域中声明的变量)一样
多次执行createCounter()函数只需重新创建一个新的局部变量“numberOfCalls”,并将其初始化为零,并返回一个有权访问该变量的新函数对象。当它明确返回函数时,为什么期望
createCounter
返回1
?@当它明确返回函数时,为什么期望createCounter返回1?内部函数本身返回的值应该是“1”,所以外部函数不应该返回内部函数的值吗?谢谢,我在理解闭包方面遇到了很多问题,因为我认为内部函数在调用外部函数时要进行评估