由于您使用.NET作为示例,让我们简要地深入研究一下。在C# 中,您可以创建一个带有 的函数Expression
:
void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
但是为了能够从对该函数的调用中提取变量名称,您必须确保调用始终使用完全正确的语法(即使在编译时无法强制执行此操作):
if(x < 0)
BadArgument(() => x);
所以它可以做到,但它非常脆弱而且非常缓慢。您基本上是在生成指令以根据 lambda 表达式创建整个表达式树() => x
,这样您调用的函数就可以解析该表达式树并尝试找到参数的名称。
这种事情可以在javascript中完成吗?当然!
在 javascript 中,闭包是通过内部函数产生的,所以上面的 lambda 表达式的等价物是:
function(){return x;}
由于 javascript 是一种脚本语言,因此每个函数都相当于它自己作为字符串的定义。换句话说,调用.toString()
上述函数将产生:
function(){return x;}
这个 jsfiddle 展示了如何在日志风格的函数中利用它。然后您可以自由地解析生成的函数字符串,这只会比解析 .NET 表达式树稍微麻烦一些。此外,获得实际值的x
比.NET更容易:你刚才打电话的功能!
但是,仅仅因为您可以做到,并不意味着您应该这样做。这是一个很好的奇才客厅技巧,但当它归结为它时,它不值得:
- 它很脆弱:如果某些开发人员没有正确使用它并为您提供无法解析的功能怎么办?
- 它不适用于缩小:想象一下收到一条消息,指出变量
a
的值不正确,因为您的缩小函数更改了您的变量名称。
- 它增加了开销:即使是 minifier 也不能缩短
function(){return x;}
到小于"x"
.
- 最后,它很复杂。'纳夫说。