Closure缓存变量?

时间:2014-06-05 13:23:08

标签: javascript

我的代码有问题,但我无法找到它的内容。我第一次调用registerStartDateValidation时,defineKeyword闭包中的startDateValidation变量的值当然与闭包之外的受影响的值相同。但第二次,变量再次受到另一个值的影响,但defineKeyword中startDateValidation的值仍然等于我们第一次调用registerStartDateValidation时的值。闭包是否缓存变量?

Tv4.prototype.registerStartDateValidation = function (attributes) {
    var helper = this;
    var dateNames = Object.keys(attributes);
    var startDateName = dateNames[0];
    var startDateString = attributes[startDateName];
    var endDateName = dateNames[1];
    var endDateString = attributes[endDateName];
    var startDateValidation = helper.startDateValidation(startDateString, startDateName, endDateString, endDateName);

    console.log(startDateValidation)//First time equal "true", second time equal "false"

    tv4.defineKeyword('startDate', function (data, value) {
        if (value === 'startDate') {
            console.log(startDateValidation)//First time equal "true", second time still equal "true"
            return startDateValidation
        }
    });

};

请注意,没有任何内容发出ajax请求,这可能会破坏调用函数的顺序。

1 个答案:

答案 0 :(得分:0)

简短回答:不,闭包不会缓存变量,因此代码中还会发生其他事情。将问题简化为一个演示问题的简单完整示例,通常可以明确问题的来源,或至少帮助其他人解决问题。

但是,由于看起来你所指的是this project,所以有可能弄清楚发生了什么。如果为同一个关键字多次调用新函数,Tv4.defineKeyword()会将新函数附加到列表中。由于您拨打的是tv4.defineKeyword(请注意小写的“t”),而不是helper.defineKeywordthis.defineKeyword,看起来每次调用registerStartDateValidation都会影响同一个实例,所以当你想要替换它时,几乎可以肯定添加验证功能。