这是声明一个变量 - 对吧?

时间:2014-04-13 08:50:06

标签: javascript variables

在博客上,我看到以下内容:

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/

2 个答案:

答案 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 ++甚至汇编,它们在基本的内存级别工作,并且使用构造称为迭代器,以便在数据结构比简单数组更高级的情况下支持循环值。