Javascript for-loop变量范围?

时间:2017-04-22 17:30:26

标签: javascript

我来自C ++背景,是java脚本的新手,很难理解循环范围。在for循环中初始化变量的范围是什么。

//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.有人可以解释一下吗?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

var将变量范围限定为当前函数,而不是当前块(与let不同)。