Page 273 - 你不知道的JavaScript(下卷)
P. 273

7.7.3 元在何处

               TCO 和元编程又有什么关系呢?

               正如我们在 7.6 节中介绍的,可以在运行时判断引擎支持哪些特性。其中就包括 TCO,尽
               管确定方法是十分暴力的。考虑:

                   "use strict";

                   try {
                       (function foo(x){
                           if (x < 5E5) return foo( x + 1 );
                       })( 1 );

                       TCO_ENABLED = true;
                   }
                   catch (err) {
                       TCO_ENABLED = false;
                   }
               在非 TCO 引擎中,递归循环最终会失败,抛出一个异常被 try..catch 捕获。换句话说,
               有了 TCO,循环才能完成。

               不怎么样,对吧?

               而围绕着 TCO 特性(或者,这个特性的缺失)的元编程对我们的代码有什么好处呢?简
               单的答案是,可以通过这种特性测试来决定是加载使用递归的应用代码版本,还是转换 /
               transpile 为不需要递归的版本。
               自适应代码
               还有另外一种看问题的方式:

                   "use strict";

                   function foo(x) {
                       function _foo() {
                           if (x > 1) {
                               acc = acc + (x / 2);
                               x = x - 1;
                               return _foo();
                           }
                       }

                       var acc = 1;

                       while (x > 1) {
                           try {
                               _foo();
                           }
                           catch (err) { }



               250   |   第 7 章
                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   268   269   270   271   272   273   274   275   276   277   278