gdo*_*ica 6 .net javascript reflection jquery
有没有办法获取变量名称,就像你可以在.Net中使用反射一样?
像在这种情况下:
function(x,y,z)
{
if (x === 0)
logger.log('variable ' + x.reflectedName ' has invalid value ' + x)
// logs: 'variable x has invalid value 0)
...
}
Run Code Online (Sandbox Code Playgroud)
我发现类似的问题需要函数外的var名称(?!)但是找不到这个问题.
(jQuery是一个选项,但我无法想象如何用它来完成...)
其实你CAN.这是一个片段:
function getVarName(v) {
for (var key in window) {
if (window[key] === v)
return key;
}
}
var testvar = 13142;
function test(t) {
var varName = getVarName(t);
// window[varName] -- your variable actualy
alert(varName);
}
test(testvar); // testvar
Run Code Online (Sandbox Code Playgroud)
另一个问题是如果您创建一些包含相同变量的变量.然后将返回第一个var.
由于您使用.NET作为示例,让我们简要介绍一下.在C#中,您可以创建一个函数,该函数采用Expression:
void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
Run Code Online (Sandbox Code Playgroud)
但是为了能够从对此函数的调用中提取变量名,您必须确保调用始终使用完全正确的语法(即使在编译时无法强制执行此操作):
if(x < 0)
BadArgument(() => x);
Run Code Online (Sandbox Code Playgroud)
所以它可以做到,但它非常脆弱而且很慢.您基本上生成了基于lambda表达式创建整个表达式树的指令() => x,因此您调用的函数可以解析该表达式树并尝试查找参数的名称.
这种事可以用javascript完成吗?当然!
在javascript中,闭包是通过内部函数生成的,因此上述lambda表达式的等价物将是:
function(){return x;}
Run Code Online (Sandbox Code Playgroud)
由于javascript是一种脚本语言,因此每个函数都相当于它自己的字符串定义.换句话说,调用.toString()上面的函数将产生:
function(){return x;}
Run Code Online (Sandbox Code Playgroud)
这个jsfiddle展示了如何在日志记录式函数中利用它.然后,您可以自由地解析生成的函数字符串,这将比解析.NET表达式树稍微麻烦一点.此外,获得实际值的x比.NET更容易:你刚才打电话的功能!
但仅仅因为你能做到并不意味着你应该这样做.这是一个很好的作为一个gee-whiz客厅技巧,但当它来到它,它是不值得的:
a的值不正确,因为缩小的函数改变了变量名.function(){return x;}到小于"x".你不能.但是既然你已经知道了变量名(因为你必须使用它来将它连接到字符串的末尾),为什么不直接输入呢?
即:
logger.log('variable x has invalid value '+x);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7760 次 |
| 最近记录: |