2017-04-22 103 views
1

我來自C++的背景和新的Java腳本和難以理解的循環範圍。 for循環中初始化的變量的作用域是什麼?JavaScript的循環變量範圍?

//Setup 
 
var contacts = [ 
 
    { 
 
     "firstName": "Akira", 
 
     "lastName": "Laine", 
 
     "number": "0543236543", 
 
     "likes": ["Pizza", "Coding", "Brownie Points"] 
 
    }, 
 
    { 
 
     "firstName": "Harry", 
 
     "lastName": "Potter", 
 
     "number": "0994372684", 
 
     "likes": ["Hogwarts", "Magic", "Hagrid"] 
 
    }, 
 
    { 
 
     "firstName": "Kristian", 
 
     "lastName": "Vos", 
 
     "number": "unknown", 
 
     "likes": ["Javascript", "Gaming", "Foxes"] 
 
    } 
 
]; 
 

 

 
function lookUpProfile(firstName, prop){ 
 
    for(var i=0;i<contacts.length;i++){ 
 
     if(contacts[i].firstName==firstName){ 
 
      if(contacts[i].hasOwnProperty(prop)) 
 
      return contacts[i][prop]; 
 
      else 
 
      return "No such property"; 
 
     } 
 
    } 
 
    
 
    if (i === contacts.length) 
 
    return "No such contact"; 
 

 
} 
 

 
// Change these values to test your function 
 
lookUpProfile("Akira", "likes");

我很困惑如何if (i === contacts.length)變量 「i」 被用來爲外循環,變量 「i」 初始化是在for循環和if語句寫出來的for循環範圍。在循環打印時,document.write(i)的值等於4。有人請解釋一下嗎?

+0

變量與聲明 'for循環' 的範圍,僅在循環中的限制。你不能訪問範圍外的for循環'i'變量。 –

+0

說真的,@AkshayChawla爲自己運行這段代碼。 – Priyansh

+0

不知道這件事。這是偉大的:)它限於功能。 –

回答

2

var作用域的可變到當前功能,而不是當前塊(不像let)。

3

在ECMAScript 6之前,javascript只支持功能範圍。在函數中聲明的變量在該函數內的任何位置都可見。即使是這樣:

function foo() { 
 
    if(true) { 
 
    if(true) { 
 
     var v = 7; 
 
    } 
 
    } 
 

 
    console.log(v); // 7 
 
} 
 
foo();

的ECMAScript 6引入使用let,尊重塊範圍聲明變量的一種新的方式。所以:

function foo() { 
 
    if (true) { 
 
    if (true) { 
 
     let v = 7; 
 
    } 
 
    } 
 

 
    console.log(v); // error 
 
} 
 
foo();

+0

但ECMA腳本6中的var不尊重變量的範圍。這意味着一旦我在函數中的任何一點聲明瞭一個變量,我將始終能夠在變量範圍之外的任何地方使用該變量? – Priyansh

+0

@Priyansh正如我所說的,當使用'var'時唯一的作用域是函數作用域。即使在使用'var'聲明的ES 6中,只要不輸入其他函數的作用域,該變量就可以在該函數內的任何位置顯示該變量。 –

+0

@Priyansh在它的*函數範圍內否定其唯一可訪問 –