我来自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.有人可以解释一下吗?
答案 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
不同)。