声明没有赋值的变量有什么意义?

What is the point of declaring variables without assignment?

本文关键字:什么 赋值 声明 变量      更新时间:2023-09-26

我正在研究一些CreateJS样本,其中一个我已经看到了这个,我想知道它对

有什么用
(function() {
    var c = createjs;
    var a = function(blabla) {
        this.blabla = blabla;
    var p = Game.prototype;
    p.a;
    p.b;
    p.c;
    p.d;
    /*
    ... 15 variables like that ...
    */
    p.init = function(param) {
        /* blabla */
    }
    /*
    ...
    long code after that
    ...
    */
})();

它在github示例中,在/createjs/sandbox-master/PlanetaryGary目录下,它的文件是js/Game.js

我是这段代码的原作者。这种模式可以归结为一个简单的哲学:好的代码是自文档化的。

对于那些进入这个盲区的人来说,有必要快速提一下,这些属性实际上并没有被命名为a,b,c等。还值得一提的是,它们通常被分配一个默认值(尽管在这种特殊情况下没有)。

前面的变量声明显式地定义了与"类"相关联的字段。这允许开发人员从上到下进行扫描,并在查看操作它的方法之前建立类操作的数据的心理模型。

它提供了一个方便的、上下文相关的地方来钩住文档注释,尽管所引用的代码没有文档化。

/**
 * Docs for firstName here.
 **/
p.firstName = "default";
/**
 * lastName docs.
 **/
p.lastName = "default";

最后,我发现它鼓励采用更周到的方法来处理数据和文档。定义新属性的行为为查看现有属性和评估新字段的必要性提供了机会。我见过很多bug和糟糕的代码都是由于开发者随意地给类添加属性而导致的。

当您在代码的专用区域显式地定义新属性时,忘记记录新属性也要困难得多(并且更容易快速发现未记录的属性)。

在不知道太多关于某些Game对象的字母数据成员的细节的情况下,以您所展示的方式提及p.a, p.b等是准确暴露变量p结构的好方法。

在您共享的代码片段的控制流中,我们可以在对变量p执行任何初始化或其他操作之前准确地看到它具有哪些字段。

对象p有可能被赋值了getter并产生副作用:

Object.defineProperty(p, 'a', { get: function() {
  window.universalConstant = 42;
  return p._a;
});

可能,但不太可能。也许这是一种错误的文档尝试,就像@ paul建议的那样。