我正在移植一些很大程度上依赖于延迟评估的Python代码.这是通过thunks完成的.更具体地说,任何<expr>
需要延迟评估的Python表达式都包含在Python"lambda表达式"中,即lambda:<expr>
.
AFAIK,最接近的JavaScript等价物function(){return <expr>}
.
由于我正在使用的代码绝对充斥着这样的thunk,我想让它们的代码更加简洁,如果可能的话.这样做的原因不仅在于保存字符(当涉及到JS时不可忽略的考虑因素),而且还使代码更具可读性.要了解我的意思,请比较此标准JavaScript表单:
function(){return fetchx()}
Run Code Online (Sandbox Code Playgroud)
同
\fetchx()
Run Code Online (Sandbox Code Playgroud)
在第一种形式中,实质性信息,即表达fetchx()
,在印刷中被周围的function(){return
...... 掩盖}
.在第二种形式1中,只有一个(\
)字符用作"延迟评估标记".我认为这是最佳方法2.
AFAICT,此问题的解决方案将分为以下几类:
eval
模拟延迟评价.我对听到最后三个类别的回答特别感兴趣.
PS:我知道使用eval
(上面的选项1)在JS世界中被广泛弃用,但是,FWIW,下面我给出了这个选项的玩具插图.
我们的想法是定义一个私有包装类,其唯一目的是将纯字符串标记为用于延迟评估的JavaScript代码.然后使用具有短名称的工厂方法(例如C
,用于"CODE")来减少例如,
function(){return fetchx()}
Run Code Online (Sandbox Code Playgroud)
至
C('fetchx()')
Run Code Online (Sandbox Code Playgroud)
首先,工厂C
和辅助函数的定义maybe_eval
:
var C = (function () {
function _delayed_eval(code) { this.code = code; }
_delayed_eval.prototype.val = function () { return eval(this.code) };
return function (code) { …
Run Code Online (Sandbox Code Playgroud)