簡體   English   中英

獲取變量名稱。 javascript“反思”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM