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) 专享 尊重版权