在博客上,我看到以下内容:
for (var key in map) {
if (map.hasOwnProperty(key)) {
var value = map[key];
// right, now we can get some work done
}
}
“现在你在for循环的顶部看到var键了吗?那不是 声明变量,哦不。它说的是其他地方有一个 变量称为键“
当然这是声明一个变量(如果一个名为key
的变量先前不存在于范围链中)?作者的意思是什么?
链接:http://dannorth.net/2011/12/19/the-rise-and-rise-of-javascript/
答案 0 :(得分:3)
当然这是声明一个变量(如果一个命名键以前没有存在于作用域链中)?
是的,在for
循环所在的函数中。(变量不仅限于for
循环,例如, Java。它的范围是整个函数。)
有关var
的更多信息(在我的博客上):Poor, misunderstood var
作者的意思是什么?
听起来很讽刺,实际上,就像作者试图通过说出与他们的意思相反的方式来说明一点。
修改由于您已发布该链接,因此完整引用:
现在您在
var
循环顶部看到for
个键?那不是声明变量,哦不。它说在其他地方有一个名为key
的变量(在最近的包含函数的顶部,结果是这样)。哦,key
变量在整个函数中是可见的,它包含的任何函数,不仅仅隐藏在for循环中。辉煌!
他试图证明这个变量并不仅限于for
循环。但最初的陈述是完全错误的。我知道他的意思,但不是他说的。
重申上述第一点,在ES6中,JavaScript将获得一个新关键字let
,该关键字将为for
循环声明仅:
// New in ES6, you probably can't use this yet
for (let key in map) {
// ^^^---------------- change is here
if (map.hasOwnProperty(key)) {
let value = map[key];
// ^^^----------------- probably want to change this one, too
// right, now we can get some work done
}
}
有些引擎已经支持它了,但你还不能广泛使用它,因为许多引擎都没有。从理论上讲,ES6草案规范可能会发生变化,但我真的对此表示怀疑。 : - )
答案 1 :(得分:1)
实际上,它是在变量map的当前迭代中获取的迭代器值的变量的完整定义。这是一个声明+初始化。
要理解迭代器的概念,你必须更深入地研究底层的解释器代码,它支持循环的每次迭代的键的值。
另外这个:“现在你看到for循环顶部的var键?那不是声明一个变量,哦不。它说其他地方有一个叫做键的变量”听起来很愚蠢,没有解释任何事情和造成混乱。
我不会阅读这样的文章,因为这样的陈述表明作者并不真正了解JavaScript背后的现实世界 - 即C / C ++甚至汇编,它们在基本的内存级别工作,并且使用构造称为迭代器,以便在数据结构比简单数组更高级的情况下支持循环值。