2015-04-16 40 views
0

我知道你會認爲這是一個重複,但我通過許多相關帖子發現的是,人們洪水每一個沒有受過教育的「不」的,這是我很高興還沒有發生在這裏。無論哪種方式,我想重新開放這個討論。塊級作用域訪問在JavaScript中

讓我們,例如,「非著名」 let聲明:

function foo() 
{ 
    var bar = 5; 

    if(true) 
    { 
     let bar = 10; 
     alert(bar); 
    } 

    alert(bar); 
} 

此功能將第一個警報10然後警報5

這是因爲bar = 5是在功能級別範圍bar = 10重新分配的塊級範圍內只保留了,這要歸功於我們的小夥計let

這就是說,塊級範圍在JavaScript中絕對存在,但我們可以如何訪問它?

舉個例子:

var arr = [ 
    { 
     label: "x" 
    }, 
    { 
     label: "y" 
    }, 
    { 
     label: "z" 
    }, 
]; 

var randIdx = Math.floor(Math.random() * 3); 

for(var i = 0; i < arr.length; i++) 
{ 
    if(i === randIdx) 
     arr[i].value = true; 
    else 
     arr[i].value = false; 
} 

function foo() 
{ 
    if(arr[0] || arr[1] || arr[2]) 
    { 
     alert((\*passing argument*\).label); 
    } 
} 

foo(); 

必須能夠訪問塊範圍目前if聲明和檢索給定表達式的傳遞參數! 塊級範圍確實存在,所以爲什麼我不能修補它!

謝謝!

+1

號但是,您可以輕鬆地將條件結果首先分配給變量。 –

+0

嗯,當然,我可以@FelixKling,但那不是重點。我沒有試圖解決分配變量的問題,我在問一個問題。 – WebWanderer

+0

當然,但正如我所說的,你想要的是不可能的,所以你必須尋找儘可能接近你想要的東西(或者只是讓它)。我只是覺得指出替代品比單純說「不」更有價值......你不覺得嗎? –

回答

5

不,這是不可能的。該if statement被定義爲

生產IfStatementif(表達)聲明 被評估如下:

  1. exprRef是評估表達的結果。
  2. 如果ToBooleanGetValueexprRef))是,迴歸(正常,空,空)。
  3. 返回評估結果聲明

正如你可以看到,的GetValue(exprRef)的結果不存儲,所以你不能在以後檢索。

相反,考慮將條件表達式給一個變量:

var myVar; 
if(myVar = SomeFunction()) { 
    myVar; // value returned by `SomeFunction` 
} 
var myVar; 
if(myVar = (x || y || z)) { // Parentheses added for clarity 
    myVar; // `x`, `y` or `z` 
} 
+0

Ehhh ...這絕對是一個合適的答案,但它仍然...我不知道...不是我正在尋找的東西。我希望通過保留字或其他內容從陳述中獲得參數。就像函數中的'arguments'一樣,沒有聲明參數。 – WebWanderer

+1

@WebWanderer:如果你真的想這樣做,那麼你必須創建自己的JS方言(編譯爲JS)。但是在「普通」JS中可能嗎?編號 –

+0

請注意,這是不好的做法,尤其是第一個例子,因爲未來的維護人員很容易將其誤解爲bug,並用'=='替換'='。如果你必須這樣做,留下評論。但是,如果你仍然留言,那麼也可以採用更常用的方式 - 更不用說輸入 – slebetman