2017-02-11 55 views

回答

5

當您在隱藏一個存在於含有範圍的範圍申報的標識符這是:

var foo; // The outer one 
function example() { 
    var foo; // The inner one -- this "shadows" the outer one, making the 
      // outer one inaccessible within this function 
    // ... 
} 

有幾種方法,你可能會影東西:

  1. 用變量聲明(var,let,const),如上

  2. 隨着參數聲明:

    var foo; // The outer one 
    function example(foo) { // This parameter shadows the outer `foo` 
        // ... 
    } 
    
  3. 與函數聲明:

    var foo; // The outer one 
    function example() { 
        function foo() { // This shadows the outer `foo` 
        } 
        // ... 
    } 
    

...和其他幾個人。任何在隱藏範圍內聲明標識符的東西(陰影)在包含範圍中的一個,這是一個影子聲明/定義。

+0

命名函數語句和catch塊也可以屏蔽外部變量。 – lonesomeday

2

維基百科定義(https://en.wikipedia.org/wiki/Variable_shadowing):

在計算機程序中,當在一定的範圍(判定框,方法,或內 類)內聲明的變量 具有相同的名稱作爲一個變量發生可變遮蔽在外部範圍內聲明。在 標識符的級別(名稱,而不是變量),這被稱爲 作爲名稱掩碼。據說這個外部變量被 內部變量所遮蔽,而內部標識符被認爲掩蓋了外部標識符 。這可能會導致混淆,因爲可能不清楚哪個 變量後續使用影子變量名引用,哪個 依賴於該語言的名稱解析規則。

Java示例:

public class Shadow { 
     private int myIntVar = 0; 

     public void shadowTheVar(){ 

      // since it has the same name as above object instance field, it shadows above 
      // field inside this method 
      int myIntVar = 5; 

      // If we simply refer to 'myIntVar' the one of this method is found 
      // (shadowing a seond one with the same name) 
      System.out.println(myIntVar); 

      // If we want to refer to the shadowed myIntVar from this class we need to 
      // refer to it like this: 
      System.out.println(this.myIntVar); 
     } 

     public static void main(String[] args){ 
      new Shadow().shadowTheVar(); 
     } 
    } 
0

對於你的問題考慮這個代碼

function foo(a) { 
var b = 2; 
// some code 
function bar() { 
// ... 
} 
// more code 
var c = 3; 
} 

在這個片段中,當您嘗試從全局範圍內執行。

bar(); // fails 
console.log(a, b, c); // all 3 fail 

在功能欄中(假設){....}如果你有其他代碼等

function foo(){ 
var b = 3; 
console.log(b); 
} 

那麼就意味着foo的linside杆被遮蔽foo的(a)中在全球範圍

相關問題