是否可以在js中创建自己的条件/控制流语法?例如:
when( condition ) {
// execute code
}
这会为变量/对象添加某种侦听器,并在条件为真时执行。
我可能只需要创建自己的编程语言。
答案 0 :(得分:1)
这实际上是两个问题:
第一个答案是否定的。您可以使用像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本身没有任何用于创建自己语法的实用程序。为此,在线和在NPM存储库中存在许多工具,通过将其转换为与浏览器兼容的JavaScript,向JS添加此类功能。这是一个小样本:
require()
功能所有这些转换器,无论多么不同,都以相同的方式工作:它们将源文件解析为抽象语法树(或AST),在该树上运行一些转换,然后吐出生成的JavaScript文件。如果你想在JavaScript中创建自己的特殊语法,你或多或少会做同样的事情。 (Uglify.JS在这方面特别具有可定制性。)
所有这些都表明,这些转换器都没有从根本上改变JavaScript的工作方式 - 您仍然需要将您想要使用的任何花哨语法翻译成普通的浏览器可执行JavaScript。这意味着虽然您将能够编写when(){}
块语法,但括号内的表达式不能是简单的Boolean
表达式,但必须包含类似于Observable
对象的插入回调(Knockout.JS确实有一个工具,用于从其Observables构建的表达式中执行此操作。)