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

Javascript-创建自己的条件/控制流,javascript,Javascript,是否可以在js中创建自己的条件/控制流语法?例如: when( condition ) { // execute code } 这将向变量/对象添加某种侦听器,并在条件为真时执行 我可能只需要创建自己的编程语言。这实际上是两个问题: 语法可以直接添加到JavaScript中吗 我可以设置在条件更改时运行的代码吗 第一个问题的答案是否定的。您可以使用像宏一样的预处理来完成这一点,但这并非小事 2的答案是肯定的,您可以在任何符合ES 5的环境(即9+)中实现这一点: 因此,每当任何代码更改con

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

when( condition ) {
 // execute code
}
这将向变量/对象添加某种侦听器,并在条件为真时执行


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

这实际上是两个问题:

  • 语法可以直接添加到JavaScript中吗
  • 我可以设置在条件更改时运行的代码吗
  • 第一个问题的答案是否定的。您可以使用像宏一样的预处理来完成这一点,但这并非小事

    2的答案是肯定的,您可以在任何符合ES 5的环境(即9+)中实现这一点:

    因此,每当任何代码更改
    condition.isTrue
    时,如果更改是真实的,则将运行指定的代码。但对于这种情况,我更喜欢不太特别的方法。ES 2015代理陷阱使它更干净(IMHO),但支持还不太到位。你今天真正想在这里完成工作的是一个

    还要注意的是,编写一种语言来解决这样的问题大致相当于用零配件制造一辆汽车,然后开车去商店买食品。只要买辆车。

    欢迎来到JavaScript Transpiler的精彩世界。 JavaScript本身没有任何用于创建自己语法的实用程序。对此,许多工具存在于在线和NPM存储库中,它们通过将JS转换为与浏览器兼容的JavaScript,将此类功能添加到JS中。以下是一个小样本:

    • 将ES6语法添加到ES5 JavaScript中
    • 添加Node.JS的
      require()
      功能
    • 将JS压缩为尽可能小的形式,仍然以相同的方式执行
    • (更严格地说,是它自己的语言)在JavaScript中添加了静态类型检查
    所有这些Transpiler,不管有多不同,都以相同的方式工作:它们将源文件解析为抽象语法树(或AST),在该树上运行一些转换,然后输出生成的JavaScript文件。如果您想在JavaScript中创建自己的特殊语法,您可以做或多或少相同的事情。(在这方面,Uglify.JS特别具有可定制性)



    综上所述,这些Transpiler都不能从根本上改变JavaScript的工作方式——你仍然需要将你想要使用的任何花哨的语法转换成简单的、浏览器可执行的JavaScript。这意味着,尽管您可以编写
    when(){}
    块语法,但括号内的表达式不能是简单的
    布尔表达式,而必须包含类似插入回调的
    可观察对象的内容(确实有一个工具,可以从其可观察对象构建的表达式中执行此操作).

    简短回答:不。稍微长一点的回答实际上解决了您的问题:使用可观察的。我可能只需要创建自己的编程语言。这听起来很难,javascript IMHO不是您的最佳选择……谢谢。我正在考虑一个JS框架的想法,它可以帮助抽象出典型的流程,并通过提供一个在许多情况下,它都是MVC(如Angular)和jQuery(如库)的组合,它们以某种方式协同工作。@ryanwaite28请查看aurelia。但这再次证明了这一点,始终首先检查现有的解决方案,因为它们受益于公司支持和/或大量的眼睛/现实世界的使用等。谢谢!很难发明或创新现在,我正在考虑一个JS框架的想法,它可以帮助抽象出典型的流程,并在许多情况下提供便利。它将是一个类似MVC的Angular和一个类似jQuery的库的组合,以某种方式协同工作。
    var condition = {val: null};
    Object.defineProperty(condition, "isTrue", {
      set: function(val) {
        if (val && !this.val) {
          runSomeCodeYouWantRun();
        }
        this.val = val;
      },
      get: function() {
        return this.val;
      }
    });