在Javascript

时间:2016-09-14 05:43:13

标签: javascript scope

我在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范围的变化,我将不胜感激。

Breakpoint analysis in two browsers

更新更新更新更新

关于提升有很多有用的参考资料,我很欣赏指向命名元素的重复问题的指针。很有帮助。如果我可以跟进#2的子问题,是否有人对浏览器对范围的非标准处理有任何评论。似乎Chrome至少可以区分超出范围和悬挂但未声明的范围。 IE不太具体。有什么想法吗?

1 个答案:

答案 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
}

Another incredible article on Hoisting