Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么需要在此闭包中创建变量_Javascript_Function_Variables_Closures - Fatal编程技术网

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”,所以外部函数不应该返回内部函数的值吗?谢谢,我在理解闭包方面遇到了很多问题,因为我认为内部函数在调用外部函数时要进行评估