【问题标题】:How are variables declared in constructor functions in JavaScript treated?JavaScript 构造函数中声明的变量如何处理?
【发布时间】:2014-10-14 05:06:53
【问题描述】:
function jQueryValidatorWrapper(formId, rules, messages) {
    var validator = $("form:visible[id='" + formId + "']").validate({
                         onchange: false,
                         messages: messages,
                         rules: rules
                     });

    this.validate = function (hideErrors) {
        var showErrorMessage = hideErrors ? false : true;

        // What does 'validator' refer to?
        var result = validator.form();
    };
}

当我执行这个时,

var validatorObj = new jQueryValidatorWrapper('testForm', [], []);
validatorObj.validate();

jQueryValidatorWrapper 函数只有一个用this 声明的方法,所以当构造函数执行时,它只是用validate 方法创建了一个对象。

jQueryValidatorWrapper 中声明的validator 变量会发生什么?它没有以this 为前缀,因此它不是正在构造的对象的一部分。

validator 变量是全局变量吗?还是 validate 方法的闭包的一部分?

【问题讨论】:

  • validator 不是全局变量...虽然它会存在于闭包中
  • 构造函数仍然是函数。局部变量的处理方式或作用域的工作方式没有区别。

标签: javascript


【解决方案1】:

本地的validator 变量不是全局的;由于闭包,它只能在 validate 方法中访问。

它可以被视为jQueryValidatorWrapper 对象的“私人成员”,根据 Douglas Crockford 的文章:http://javascript.crockford.com/private.html

3 个构造函数参数也是如此。

【讨论】:

  • 那么,如果我每次为 3 个构造函数参数创建具有不同数据的 jQueryValidatorWrapper 的多个实例,是否会针对之前的实例修改闭包环境?
  • 不,他们每个人都有自己的副本。这里有一个小提琴来说明这一点:jsfiddle.net/sck02myt
  • @Lakeland-FL——每次调用函数时,都会创建一个全新的执行上下文,因此在此实例中也会创建一个全新的闭包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多