[英]Get variable name. javascript “reflection”
有沒有辦法獲取變量名稱 ,就像你可以在.Net中使用反射一樣?
像在這種情況下:
function(x,y,z)
{
if (x === 0)
logger.log('variable ' + x.reflectedName ' has invalid value ' + x)
// logs: 'variable x has invalid value 0)
...
}
我發現類似的問題需要函數外的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
另一個問題是如果您創建一些包含相同變量的變量。 然后將返回第一個var。
由於您使用.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中更容易:您只需調用該函數 !
但僅僅因為你能做到並不意味着你應該這樣做。 這是一個很好的作為一個gee-whiz客廳技巧,但當它來到它,它是不值得的:
a
的值不正確的消息,因為縮小的函數改變了變量名。 function(){return x;}
縮短為小於"x"
。 你不能。 但是既然你已經知道變量名(因為你必須使用它來將它連接到字符串的末尾),為什么不直接輸入呢?
即:
logger.log('variable x has invalid value '+x);
獲取變量名很容易
//This is variable you want to get the name
var prop;
var obj = {prop};
for(var propName in obj){
alert(propName);
break;
}
你也可以試試這里 。
編輯
感謝@Brady的評論
Object.keys({variableName})[0]將為您提供變量名稱。
function(x,y)
{
const key = (obj) => Object.keys(obj)[0];
if (x === 0)
logger.log('variable ' + key({x}) + ' has invalid value ' + x)
// logs: 'variable x has invalid value 0)
if (y === 0)
logger.log('variable ' + key({y}) + ' has invalid value ' + y)
// logs: 'variable y has invalid value 0)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.