2009-02-24 55 views
7

在Javascript中,我们不必在使用它之前用var关键字声明变量。我们可以直接执行诸如myCount = 12;myStr = "Hello";(其中myCount,myStr之前未声明)。任何这样的用法,声明和初始化'全局'范围内的变量。为什么在使用它之前不一定要在JavaScript中声明一个变量?

提供此功能的原因是什么?这是一个很好的标准吗?

更新:我的问题不是'使用未声明的变量'和'声明然后使用'之间的区别以及它如何影响范围。

我的问题是'为什么它被允许在javascript中直接使用变量而没有声明',因为大多数编程语言都对此进行了严格检查。

UPDATE:我看到以下带引号的文字是此功能的一个坏影响。那么,为什么有这个功能呢?

“假设有一个全局声明的变量xvar x="comparison string")已经对此我不知道和我一起创造的意图我自己的全球性的‘X’里的我的功能之一初始化一个(x=-1),并有我弄坏其他功能。

那么,有没有在所有的任何正当理由吗?有这个功能吗?

+0

值得把你的JS代码通过克罗克福德的JSLint来检测snafu就像那样 - 和其他:) – Kristen 2009-02-24 14:46:31

+0

(对不起,我明白这不是你的问题的答案,它只是一个建议) – Kristen 2009-02-24 14:47:06

+0

而且一个很好的建议。 :) – Magnar 2009-02-26 10:29:20

回答

12

Javascript是为浏览器中的非常简单的脚本设计的。要求变量声明似乎是不必要的。

当然,这是语言错误。而JavaScript的制造商知道这一点。他们想改变它。但他们不能。为什么?

因为微软已经对工程JavaScript进行了反向处理,并创建了它们的重复JScript,包含bug和全部。微软否决了任何修改,甚至修正了错误,因为他们坚决不打破任何人的脚本。所以,即使他们改变了JavaScript,IE中的JScript也会保持不变。

这不是一个很好的理由。但这是我们拥有的。我从道格拉斯克罗克福德那里得到了我的javascript历史课程:“JavaScript编程语言”,http://video.yahoo.com/watch/111593/1710507这个故事的部分是在9到11分钟之间的视频。

4

良好的原因是什么?怎么都想不出一个,它的的几件事情我真的不喜欢JS之一。

这是可能的,因为一切都发生在在全球范围内,如果没有其他控制,JS允许像这样的隐式变量创建。这样做的代价是确定错误和污染的巨大潜力,只有“存在”才能明确定义自我范围,存在全球参考的“窗口”和“文档”,因此节省了一些字符 - 这是没有道理的在所有。

+0

是的,正是我的观点。假设已经存在一个全局声明的变量'x',但我不知道,并且我打算在函数内部创建自己的全局'x',并初始化其中的一个,然后我最终打破其他功能。有什么好理由吗? – 2009-02-24 13:44:30

+0

正如我所说,如果有的话,这是超越我的。最好问问布伦丹。 – annakata 2009-02-24 13:52:29

1

我的问题是“为什么它在javascript允许直接使用的变量没有声明这是因为大多数编程语言对此有严格的把关。

这就是静态和动态类型语言之间的区别。 Javascript是动态类型的,所以不需要首先声明。正如在其他答案中指出的那样,var关键字对变量的作用域比其声明更负责任。

我不认为大多数编程语言有检查。

0

因为它是一种脚本语言。事实上的孩子。这就是它的设计!

1

Lua也有类似的问题:默认情况下,任何非声明的变量都是全局的。在邮件列表中,这是一个反复出现的主题,询问为什么它不应该是'本地默认'。不幸的是,这会在语言中引入非常讨厌的含糊之处,所以结论通常是“默认情况下全局不好,本地默认情况更糟”

相关问题