我在CS教授本科课程,我选择Javascript作为一门语言,因为它的重量很轻。我试着编写代码并根据我所有的讲座进行测试。今天我发现我没有正确理解自己代码的输出。我曾经因为错误认为因为JavaScript在语法上与许多其他语言类似,所以它会处理像这些语言一样的范围。显然不是。我有几个奇怪的事情,我希望有人能够解释。有问题的全部代码如下。
<html>
<script>
function loadme()
{
contents.innerHTML="See this?";
contents = 7;
var tents = 7;
other();
}
function other()
{
var otherTents = 7;
}
</script>
<body onload="loadme()">
<p id="contents"></p>
</body>
</html>
问题1.显然,第一行loadme中的标识符内容是指带有该id的p标记。这似乎在浏览器中是一致的,并且表明存在一组自动生成的变量,这些变量对应于页面上所有HTML标记的ID。我甚至不知道这是可能的。如果不是让事情变得更加混乱,我可以用任何值覆盖变量,因为javascript不是强类型的。如果有人提及更全面地解释该语言的这一特性,我将不胜感激。
问题2.虽然变量帐篷在第5行之前没有被声明,但如果我检查第一行的代码,它似乎在范围内(即使该值未定义)。这不是特别有用。我最初认为这意味着变量不在范围内。现在将其与Chrome中显示为&#34;不可用&#34;的otherTents变量进行比较。帐篷可用吗? IE表示tents = undefined而其他Tents未定义时,IE帮助不大。同样,如果有人有一个有用的参考资料来解释Javascript范围的变化,我将不胜感激。
更新更新更新更新
关于提升有很多有用的参考资料,我很欣赏指向命名元素的重复问题的指针。很有帮助。如果我可以跟进#2的子问题,是否有人对浏览器对范围的非标准处理有任何评论。似乎Chrome至少可以区分超出范围和悬挂但未声明的范围。 IE不太具体。有什么想法吗?
答案 0 :(得分:-1)
你的第一个发现对我来说也是新的,所以我会尝试解决你的第二个问题。
变量可以有两种类型的范围,即本地或全局。
函数内的所有变量都被视为局部变量。与许多其他编程语言不同,JavaScript没有块级别范围。它只有功能级别范围。
var appName = "Test"; // global variable
function test(name){ // name is a local variable
var age = 20; // age is a local variable
console.log(weight); // undefined
// Note that it does not throw an error saying "Uncaught ReferenceError: weight is not defined",
// This is because the variable is available but the value is not yet assigned.
// This is because of hoisting ie. all variables inside a function are hoisted (or lifted) to the top of the function
var weight = 10; // Over here the value gets assigned
}