2017-04-22 73 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在它的*函数范围内否定其唯一可访问 –