javascript - 解释 Javascript 中的范围

标签 javascript scope

我正在教授计算机科学本科类(class),我选择 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。虽然变量 tents 直到第 5 行才声明,但如果我检查第一行的代码,它似乎在范围内(即使该值未定义)。这并不是特别有帮助。我最初认为这意味着该变量不在范围内。现在将其与 Chrome 中显示为“不可用”的 otherTents 变量进行比较。那么帐篷可以吗? IE 在说 tents=undefined 而 otherTents 未定义方面帮助不大。再说一次,如果有人有一个有用的引用资料来解释 Javascript 范围的情况,我将不胜感激。

Breakpoint analysis in two browsers

更新更新更新更新更新

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

最佳答案

您的第一个发现对我来说也是新的,因此我将尝试解决您的第二个问题。

变量可以有两种类型的作用域,即本地作用域或全局作用域。

函数内的所有变量都被视为局部变量。与许多其他编程语言不同,JavaScript 没有 block 级作用域。它只有函数级别范围。

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

关于javascript - 解释 Javascript 中的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39483200/

相关文章:

来自 JSON 的 Javascript 模板值

ipad - 无法让 UISearchBar 范围栏出现在 iPad 上的工具栏(或任何地方)中

Javascript:替换函数的范围对象

c++ - 在 C++ 中使用 ios_base 时范围解析运算符的目的是什么

javascript - getBBox() 和 getCompulatedTextLength() 一次有效,一次无效

javascript - React Hook 不能在函数内调用

javascript - 指数下降

javascript - Spidermonkey 字节码文档

没有类的 Java 方法作用域

c++ - 什么时候在 C++11 lambda 的定义中需要明确命名的变量捕获?