Javascript重新声明的全局变量覆盖旧值

2023-12-15

前几天我遇到了一个有趣的问题,想知道是否有人可以解释为什么会发生这种情况。这是我正在做的事情(出于本示例的目的,我稍微简化了示例):

  • 我正在使用方括号表示法创建一个全局范围的变量并为其分配一个值。
  • 后来我声明了一个与上面刚刚创建的变量同名的变量。请注意,我没有分配值。由于这是同一变量的重新声明,因此旧值不应被覆盖,如下所述:http://www.w3schools.com/js/js_variables.asp

    //create global variable with square bracket notation
    window['y'] = 'old';
    
    //redeclaration of the same variable
    var y;
    
    if (!y) y = 'new';
    
    alert(y); //shows New instead of Old
    
  • 问题是旧值实际上确实被覆盖了,在上面的例子中。警报显示“新”而不是“旧”。为什么 ?

我想陈述我的问题的另一种方式是上面的代码在语义方面与下面的代码有何不同:

//create global variable 
var y = 'old';

//redeclaration of the same variable
var y;

if (!y) y = 'new';

alert(y); //shows Old

Update 1:根据一些评论和答案,我正在重新表述该示例,以更好地反映我原来的问题。 罢工>

创建 2 个包含以下内容的 javascript 文件: 脚本1

//create global variable with square bracket notation
window['y'] = 'old';

Script2

//redeclaration of the same variable
var y;

if (!y) y = 'new';

alert(y); //shows New instead of Old in IE

将这两个文件包含在您的 html 文件中

<html>
 <head></head>
 <body>

  <script type="text/javascript" src="my.js"></script>
  <script type="text/javascript" src="my2.js"></script>

 </body>
</html>

在 Firefox 和 Chrome 中打开此页面会提醒“旧”,这是预期的行为。然而在 IE 8 中,页面实际上会警告“新”


当你重新声明时y with var y;,现在是未定义的,所以if(!undefined)评估为真。

在您的示例中添加另一个警报以查看此内容:

//create global variable with square bracket notation
window['y'] = 'old';

//redeclaration of the same variable
var y;
alert(y); //undefined

if (!y) y = 'new';

alert(y); // new

var不会两次初始化一个变量,但它会覆盖第一次未初始化的变量(因为它是一个新的、更局部的变量),window['y']style 执行此操作,将其添加到 window 对象。以此为例:

//create global variable with square bracket notation
window['y'] = 'old';

//redeclaration of the same variable
var y;
alert(y); //undefined

alert(window.y); //old

if (!y) y = 'new';

alert(y); //shows New instead of Old
alert(window.y);​ //still old
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript重新声明的全局变量覆盖旧值 的相关文章

随机推荐

  • 将复杂的字符串解析为日期时间

    有人可以告诉我应该如何将以下格式转换为正确的格式DateTime object 11 50 46 AM on Wednesday October 19 2011 string s 11 50 46 AM on Wednesday Octob
  • C# 运行程序并获取运行后的环境变量

    我尝试使用 C 运行两个批处理脚本 然后查看它们如何影响环境 我的代码是 string finalEnvVarsFile Path GetTempFileName string arguments string Format c 0 1 s
  • Git 子树。为什么我不能从子树而不是根开始分支?

    我正在努力尝试理解使用 Git 子树策略 我的目的是将一些不同的存储库整合到一个伞形存储库下的一个玩具存储库小家族中 我正在使用此处详细介绍的子树策略 http help github com subtree merge 我正在绞尽脑汁地试
  • 由用户重命名的按钮

    我在编写某些按钮时遇到问题 这是我到目前为止所得到的 Public Class Form1 Dim Button 12 As Button Dim X As Integer Private Sub EventName Dim message
  • C++ 带权重的随机不重复整数

    我想有效地生成 封闭 范围内唯一 非重复 整数的随机样本 0 rnd max 范围内的每个数字都可以选择 并且每个数字都与样本权重相关联 权重越大 选择该数字的可能性就越大 概率恰好weight i sum weight not taken
  • @property 和 @synthesize 在 Objective-C 中的用途是什么?

    有什么用 财产 and 合成 您能举个例子解释一下吗 非常简短的答案 他们为 ivars 创建访问器 有维基百科上的一些例子 看看那些
  • Matlab:是否有一个函数可以定位数字中的“n”位(即“75673”中的第二位数字,所以5)

    我有一个号码A 7654321 我需要位置 5 处的数字 从开头算起 或从末尾算起的数字 3 在本例中为 3 是否有一个函数可以执行以下操作 getdigit A n 其中 A 是数字 n 是我想要的数字的位置 我可以将数字转换为文本字符串
  • 仍然无法理解 ASP.NET 事件。他们有什么意义?

    也许我很慢 但我只是不明白为什么你会使用不是从实际操作 例如单击 派生的事件 当您只需调用方法时 为什么要经历创建委托和事件的繁琐工作呢 看起来 当您创建一个事件时 您所做的只是创建一种方法 让调用者通过一些复杂的过程来调用一个简单的方法
  • 如何将 ASP.NET 下拉列表 DataTextField 属性绑定到嵌套属性

    我想绑定DataTextFieldASP NET 下拉控件的属性到作为初始数据源的属性的对象的属性 我将如何完成这项特定任务 下拉数据源数据架构 public class A public string ID get set public
  • ajax请求后页面刷新

    好吧 我有一个简单的表格 仅包含一个text field 当我们点击提交时 写入文本字段的数据将存储在数据库中 通过ajax存储 ajax 工作正常并且数据已提交 但是页面会自动刷新并且 URL 包含输入字段的内容 我的表格
  • 我应该使用多个数据库吗?

    我即将使用 Ruby on Rails 创建一个应用程序 我想使用多个数据库 基本上是一个会计应用程序 每个用户都有多个公司 我想为每个公司创建一个数据库 我找到了这个帖子http programmerassist com article
  • Fiware - 上下文代理:NGSIv2 订阅问题

    我正在使用 Orion 上下文代理版本 1 2 0 我使用 NGSIv2 订阅了两个不同的 cygnus 0 11 和 0 13 如下 curl 172 21 0 23 1026 v2 subscriptions s S header Fi
  • 查找重复的图像文件

    我的硬盘中存储了大约 1 TB 的图像 这些是朋友和家人长时间拍摄的照片 从某种意义上说 这些图片中的许多都是重复的 相同的文件保存在不同的位置 可能也具有不同的名称 我想问是否有任何工具 实用程序或方法 我可以编写一个 来找出重复的文件
  • 如何使 rush 与我的 orionInstance 一起工作

    按照我之前的问题如何在 MapViewer 小部件中显示来自 OrionContextBroker 的实体我使用 Rush 配置了我的上下文代理实例 并且正在使用https ngsiproxy lab fi ware org作为 NGSI
  • 如何使用java并发编程的ExecutorService?

    我使用下面的代码在远程服务器上上传图像 当我使用下面的代码时 它会同时在远程服务器上上传所有图像 List
  • 排序功能未按预期工作

    我有一个对象数组 实际上是从后端获取的 现在我正在映射数据 并希望通过单击按钮按升序和降序对其进行排序 所以我创建了一个 onSort 函数 但它不起作用我预计 因为大写和小写问题存在 即使按字母顺序排列 最后显示小写 数字没有排序 还有另
  • 如何在单元格选择/取消选择时正确切换 UITableViewCellaccessoryType?

    我正在尝试切换配件类型当选择 取消选择表格单元格时 行为应该是 点击 gt 将accessoryType 设置为UITableViewCellAccessory复选标记 gt 再次点击单元格 gt 回滚到UITableViewCell 附件
  • .NET 4.5 SslStream - 取消异步读/写调用?

    有没有办法取消 SslStream 上的异步读取或写入任务 我尝试为 ReadAsync 提供 CancellationToken 但它似乎不起作用 当以下代码达到超时 Task Delay 时 它会调用 CancellationToken
  • 为 python 2 和 python 3 安装 scipy

    I used sudo apt get install python scipy安装 scipy 这将所有文件放入 usr lib python2 7 dist packages scipy 我最好的猜测是它选择该位置是因为 python
  • Javascript重新声明的全局变量覆盖旧值

    前几天我遇到了一个有趣的问题 想知道是否有人可以解释为什么会发生这种情况 这是我正在做的事情 出于本示例的目的 我稍微简化了示例 我正在使用方括号表示法创建一个全局范围的变量并为其分配一个值 后来我声明了一个与上面刚刚创建的变量同名的变量