qx.log.appender 语法

qx.log.appender Syntax

当声明 qx.log.appender.Native 或 qx.log.appender.Console 时,我的 IDE (PyCharm) 抱怨语法:

// Enable logging in debug variant
if (qx.core.Environment.get("qx.debug"))
{
    qx.log.appender.Native;
    qx.log.appender.Console;
}

(如documented here

我得到的警告是

Expression statement is not assignment or call

这个预处理器是神奇的还是我还不知道的 JavaScript 语法的一个特性?

澄清一下我的问题不明确:

我知道这是非常好的 JavaScript 语法。从评论中我得出结论,这不是导致附加日志附加程序的神奇 JS 行为,而是一些预处理器功能?!

但是这是如何工作的呢?它是硬编码处理还是此语法适用于所有遵循特定约定的 类?

如何关闭 linter 警告的提示很有用,但我更想知道这个 "magic" 是如何工作的

这是一个有效的 JS 语法,所以很可能是 linter's/preprocessor 的警告(看起来类似于 ESLint 的 no-unused-expressions)。


编辑:

对于问题的另一部分 - 此语法最有可能使用 getters or (rather unlikely as it is a new feature) Proxies。 MDN 提供了一些简单的例子来说明它是如何工作的。

顺便说一句:没有“原生”JS 预处理器这样的东西。有像 BabelTypeScript's compiler 这样的编译器,但它们是独立的项目,与 vanilla JavaScript.

无关

虽然默认情况下是合法代码,但我发现它有点难看,因为它是 "useless statement"(结果被忽略),除了我的编辑也抱怨它之外。在我的代码中,我总是把它改成这样:

var appender;

appender = qx.log.appender.Native;
appender = qx.log.appender.Console;

德雷尔

生成器读取您的代码以确定您的应用程序需要哪些 classes,以便它可以生成仅具有最少 classes 的优化应用程序。

这两行是有效的 Javascript 语法,并且存在是为了创建对两个 class 的引用,以便生成器知道包含它们 - 没有它们,你不会在您的应用程序中进行任何登录。

另一种创建引用的方法是在 class 注释中使用 @use 编译器提示,例如:

/**
 * @use(qx.log.appender.Native)
 * @use(qx.log.appender.Console)
 */
qx.Class.define("mypackage.Application", {
  extend: qx.application.Standalone,

  members: {
    main: function() {
      this.base(arguments);

      this.debug("Hello world");
    }
  }
});

这同样有效,并且没有不寻常的语法 - 但是,在此版本中,您的应用程序将始终引用那些日志附加程序,而在您使用的框架中对 qx.log.appender.Native/Console 的引用被 if (qx.core.Environment.get("qx.debug")) {...} 包围,这意味着在您的应用程序的非调试 ./generate.py build 版本中,通常会排除日志附加程序。

你是否认为这是一件好事取决于你 - 就个人而言,这些天我发布所有应用程序时都启用了日志附加程序并正常工作,这样如果有人有问题我可以查看日志(你可以编写自己的 appender 将日志发送到服务器,或者只是远程控制用户的计算机)

编辑:另一个细节是,当创建 class 时,它可以有一个 defer 函数来进行额外的初始化——在这种情况下,生成器检测到 qx.log.appender.Console 是需要它确保 class 已加载; class' defer 方法然后将自己作为附加程序添加到 Qooxdoo 日志系统