$const(varName: string, value: any) { const variable = this.variables[varName]; if (!variable) { this.variables[varName] = new Variable('const', value); return true; } return false; } $let(varName: string, value: any) { const variable = this.variables[varName]; if (!variable) { this.variables[varName] = new Variable('let', value); return true; } return false; }
var 的声明方式稍微有一点差异,因为js中,除了在 function 中,用var 声明的变量是会被声明到父级作用域的(js的历史遗留坑)。我们看下代码
$var(varName: string, value: any) { let scope: Scope = this; while (!!scope.parent && scope.scopeType !== 'function') { scope = scope.parent; } const variable = scope.variables[varName]; if (!variable) { scope.variables[varName] = new Variable('var', value); } else { scope.variables[varName] = variable.$set(value); } return true }
除了声明,我们还需要一个寻找变量的方法,该方法会从当前环境开始,一直沿着作用域链,找到最外层的环境为止。因此,代码实现如下
$find(varName: string): null | IVariable { if (Reflect.has(this.variables, varName)) { return Reflect.get(this.variables, varName); } if (this.parent) { return this.parent.$find(varName); } return null; }
以上,一个基本的javascript元循环求值器就完成了
最后
大家可以在 在线体验一下。
完整的项目地址是:nvwajs,欢迎鞭策,欢迎star。
参考
《SICP》
微信小程序也要强行热更代码,鹅厂不服你来肛我呀
到此这篇关于编写一个javascript元循环求值器的方法的文章就介绍到这了,更多相关javascript元循环求值器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章: