Javascript 作用域变量理论

2023-12-07

我有两个行为不同的示例页面,我想知道原因。对我来说,根据我收集的关于 javascript 范围界定的信息,它们似乎彼此一致。

1.html:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
  function demofunction(x, y) {
    z=x+y;
  }
</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>4-6.htm</title>
</head>
<body>
    <h1>Bad Scoping</h1>
    <script type="text/javascript">
    //<![CDATA[
    demofunction(3, 2);
    alert(z);
    var z;
    alert(z);
    //]]>
    </script>
    <p>&nbsp;</p>
</body>

</html>

在此示例中,demofunction 运行并将全局变量 z 设置为 5。alert 运行,由于作用域中没有 z,因此它会获取全局作用域并找到等于 5 的 z,因此会发出警报。然后定义一个名为 z 的新局部变量。第二个警报可以看到该局部变量,但由于它未定义,因此它选择全局变量并再次警报 5。

2.html

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Bad Scoping</title>
  <script type="text/javascript">
  //<![CDATA[
  first = 6;
  document.writeln('<p>first is ' + first + "</p>");

  function letsSee() {
    alert(first);
    var first;
    first = 4;
  }
  letsSee();
  document.writeln('<p>but now first is ' + first + "</p>");

  //]]>
  </script>
</head>
<body>
</body>
</html>

全局第一个被设置为 6。letSee() 运行并且警报(如果一致)应该看到没有名为第一个的局部变量,因此它应该向全局变量 6 发出警报。然后定义一个局部第一个,然后将其设置为 4。letsSee( ) 存在,最后打印打印全局第一个并再次显示 6。

但这并没有发生。发生的情况是它显示 6,警报未定义,并显示 6。我的问题是为什么它警报未定义而不是 6?如果我评论里面的行letSee forvar first;然后我看到它警报 6,然后显示 4。这对我来说很有意义。但是为什么在警报之后首先使用该 var 会对警报调用所看到的值产生影响?特别是当它在 1.html 中没有产生任何影响时。


var and function声明是hoisted在执行任何代码之前。

function letsSee() {
  alert(first);
  var first;
  first = 4;
}

表现得像

function letsSee() {
  var first = undefined;
  alert(first);
  first = 4;
}

作为一个更容易理解的示例,您可以在声明函数之前调用函数:

foo();  // works!
function foo() { ... }

这是因为function首先查看并提升声明,您可以在任何地方调用它,无论您在代码中声明它的时间/位置。使用声明的变量也会发生同样的情况var。变量本身(name) 被吊起。写作var foo; anywhere在给定范围内将产生任何更高范围的变量foo在此范围内无法访问。

var foo = 'foo';

function () {
    alert(foo);        // All of these can't see the higher-scoped
    doSomething(foo);  // foo = 'foo' variable, because the
    return foo;        // local foo has already been hoisted.

    var foo;  // masks the higher-scoped foo within the entire scope,
              // even if it doesn't appear to be executed
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 作用域变量理论 的相关文章

随机推荐

  • 使用循环创建菱形图案

    我正在尝试编写一个程序 该程序读取整数并使用星号显示给定边长的实心菱形 例如 如果边长是4 程序应该显示 这就是我正在尝试做的事情 它正在执行 但我似乎无法为程序提供正确的空间来正确显示菱形形状 userInput int input Pl
  • 如果 json 字段具有特殊字符(如点),则访问 json 字段值

    如果我有一个 json 文件 其中的字段具有特殊字符 在我的例子中是点 我如何访问空手道中的字段值 例如有一个名为 example json 的 json 文件 field1 field2 value2 field 3 value3 如果我
  • 根 ViewController 内的 UIViewController 不旋转

    我有一个 UIViewController 我想将其作为独立层添加到整个应用程序的顶部 所以我尝试在应用程序委托中使用 self window addSubview viewController view 将其添加到 UIWindow 中
  • 将 9 位值作为字节写入 C 中的文件

    我有一个整数值从 0 511 最多 9 位 的数组 我正在尝试将其写入文件fwrite 例如 对于数组 257 258 259 Which is 100000001 100000010 100000011 I am trying to wr
  • 设置配置文件的过期时间

    是否可以设置配置文件的到期日期 我正在公司内部进行试用 我想设定expiration审判结束的日期 而不是仅仅一年之后creation日期 是否有可能 或者总是需要一年的时间creation date 另外 如果无法设置expiration
  • 无法从 json 对象访问数据

    我已将 json 数据结构存储在具有单列的数据框中 名为json 数据在R中 所以我的 json 文本以这种格式存储 row 1 results formatted address Sahibzada Ajit Singh Nagar Pu
  • 使用 Dumper 不会触发故障

    当运行这样的代码时 use strict print Dumper something 编译和运行时没有打印任何内容 也没有发生错误 为什么会出现这种情况 为什么不strict阻止此代码运行 尽管 Dumper 未知 但为什么运行时没有错误
  • 在docker容器内运行maven集成测试

    在运行集成测试之前 我使用 dockerfile maven 插件将我的 jar 文件移动到 docker 容器内 但是 mvn verify 命令构建图像并运行集成测试 结果测试失败 有人可以帮我在运行集成测试之前运行 docker 镜像
  • Python 中的节拍器脚本中的计时问题(使用 Pygame)[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个节拍器脚本 它可以为我提供音频反馈并将 MIDI 消息发送到合成器 我用Python 2 7 5 and Pygame 1 9 1 release在 Linux Mint 16 上 我对 MID
  • Pytest 日志记录忽略 pytest.ini 中的选项

    我正在运行一个测试 pytest capture no verbose rootdir testing testing tests docker test py from home user development 该测试检查某些容器是否正
  • 同步 WrapPanel 中的 WPF 控件宽度

    我有这个案例
  • 这个命名变量是如何工作的?

    我是Python的初学者 我发现了一种奇怪的变量命名方式 并且根本无法理解 有人能帮助我吗 x 1 n 1 1 3 for i in n y x x i 我想理解这一行y x x i这是什么意思 这称为元组拆包 右边只是一个元组 表达式中的
  • 多线程内的 OpenGL VBO

    我正在用 C OpenGL 开发一个程序 它可以绘制整个世界的地形 我有一个以图块形式存储的海拔高度数据库 每次启动程序时 都会加载一个图块 然后 当人移动时 应该加载另一个图块 这不会每帧都发生 可能每 5 分钟一次 我将初始图块加载到显
  • 检查循环(模 16)数是否大于另一个?

    我有两个以 16 为模的循环整数 因此它们的值介于 0 到 15 之间 我需要比较两个数字以确定是否n 1大于n 0 n 1 gt n 0 显然 这没有准确定义 所以我定义n 1大于n 0如果小于前面8个 数字 否则小于n 0 如果不相等
  • 在 F# 中通过声明性映射指定函数组合

    The Clojure Prismatic Plumbing 库可以用来提供应用程序或模块函数图的声明性和显式定义 简而言之 它提供了一种将每个函数指定为带有标签的节点的方法 该标签也是输出标签 带标签的输入和实现 为此 它使用在宏中定义的
  • 如何通过 jQuery 隐藏控件组?

    在我的 Sharepoint 项目 Web 部件 网页中 我在 ascx cs 文件中使用 C 动态创建页面元素 控件 在 ascx 文件中 我使用 jQuery 来响应页面上发生的事件 选择 复选框状态的更改等 我需要有条件地使页面上的控
  • 如何在 Rails 和 Postgresql 中查找带有多个标签的帖子

    我有模型Post Tag and PostTag 一个帖子通过帖子标签有很多标签 我想查找专门标记有多个标签的帖子 has many post tags has many tags through post tags 例如 给定这个数据集
  • HTC 设备上的 imeoptions

    我在 HTC 设备上看不到像 did 和 like 这样的 imeoptions 而相同的代码在 Motorola 上运行良好 这是代码
  • 如何使用 Youtube API v3 将 Youtube 视频静音?

    我在用着Youtube API V3用于在我的中播放视频安卓应用程序 但是 我正在将文本转语音与视频一起使用 所以我想mute视频 以便可以听到其他音频 我搜索了文档和互联网 但只找到了 javascript 的解决方案 任何帮助 将不胜感
  • Javascript 作用域变量理论

    我有两个行为不同的示例页面 我想知道原因 对我来说 根据我收集的关于 javascript 范围界定的信息 它们似乎彼此一致 1 html h1 Bad Scoping h1