为什么在重新定义函数时函数变量会继续存在?

Edw*_*uay 0 javascript function

作为这个问题的后续仍然试图解决Javascript函数异常,有人可以解释为什么下面的代码有效吗?

我的文字(Javascript Patterns)说明:

如果您创建一个新函数并将其分配给已经拥有另一个函数的同一个变量,那么您将使用新函数覆盖旧函数.

这将使我认为下面的代码中,变量countname函数的第二个定义时,将重挫test创建.

变量countname生活在哪里?

$(document).ready(function() {

    var test = function() {
        var name = 'The Test Function';
        var count = 1;
        console.log(name + ' has been setup');
        test = function() {
            console.log('Number of times ' + name + ' has been called: ' + count);
            count++;
        };
    }
    test();
    test();
    test();
    test();
    test();
});
Run Code Online (Sandbox Code Playgroud)

输出:

替代文字

T.J*_*der 7

正在替换该test函数,但是您正在用一个"关闭"(具有持久引用)第一个函数调用创建的变量的函数替换它.这就是为什么你看到它们继续存在,即使之前的函数调用已经返回.关于闭包的更多信息,它们是语言中非常重要的一部分.

这是对正在发生的事情的细分.

  1. 您创建一个函数并将其分配给test.
  2. 你打电话test.
  3. JavaScript解释器为该调用设置一个称为执行上下文的对象test.一个执行上下文有一种叫做变量对象.此对象(您无法直接访问)具有var该调用的所有参数和s的属性test.
  4. 您的代码test设置,包括创建一个函数并将其分配给test变量.新函数对创建它的执行上下文有持久的引用,这意味着即使第一次调用test返回,新函数仍然可以访问(通过变量对象)为调用创建的变量.
  5. test再打电话(新的).
  6. 它访问第一次调用创建的变量(变量对象的属性).