Javascript - 创建自己的条件/控制流程

时间:2017-02-21 16:25:25

标签: javascript

是否可以在js中创建自己的条件/控制流语法?例如:

when( condition ) {
 // execute code
}

这会为变量/对象添加某种侦听器,并在条件为真时执行。

我可能只需要创建自己的编程语言。

2 个答案:

答案 0 :(得分:1)

这实际上是两个问题:

  1. 可以直接将语法添加到JavaScript吗?
  2. 我可以设置在条件发生变化时运行的代码吗?
  3. 第一个答案是否定的。您可以使用像sweet.js宏这样的预处理来实现这一点,但这非常重要。

    2的答案是肯定的,你可以在任何符合ES 5的环境(IE 9 +)中完成此任务:

    var condition = {val: null};
    Object.defineProperty(condition, "isTrue", {
      set: function(val) {
        if (val && !this.val) {
          runSomeCodeYouWantRun();
        }
        this.val = val;
      },
      get: function() {
        return this.val;
      }
    });
    

    因此,每当任何代码更改condition.isTrue时,如果更改是真的,将运行指定的代码。但对于这样的情况,我更喜欢不那么特别的方法。 ES 2015代理陷阱使这个更清洁(恕我直言),但支持还没有完成。你今天要在这里完成工作的目的是Observable

    另请注意,编写一种语言来解决这样的问题大致相当于用备件制造汽车来开车去商店购买杂货。只买车。

答案 1 :(得分:1)

欢迎来到JavaScript转换器的精彩世界。

JavaScript本身没有任何用于创建自己语法的实用程序。为此,在线和在NPM存储库中存在许多工具,通过将其转换为与浏览器兼容的JavaScript,向JS添加此类功能。这是一个小样本:

  • Babel.js将ES6语法添加到ES5 JavaScript
  • Browserify添加了Node.JS的require()功能
  • Uglify.JS将JS压缩为可能仍然以相同方式执行的最小形式
  • TypeScript(虽然技术上更为自己的语言)将静态类型检查添加到JavaScript

所有这些转换器,无论多么不同,都以相同的方式工作:它们将源文件解析为抽象语法树(或AST),在该树上运行一些转换,然后吐出生成的JavaScript文件。如果你想在JavaScript中创建自己的特殊语法,你或多或少会做同样的事情。 (Uglify.JS在这方面特别具有可定制性。)

所有这些都表明,这些转换器都没有从根本上改变JavaScript的工作方式 - 您仍然需要将您想要使用的任何花哨语法翻译成普通的浏览器可执行JavaScript。这意味着虽然您将能够编写when(){}块语法,但括号内的表达式不能是简单的Boolean表达式,但必须包含类似于Observable对象的插入回调(Knockout.JS确实有一个工具,用于从其Observables构建的表达式中执行此操作。)