同名的变量和函数在块内返回错误

2023-11-27

如果我们声明一个变量和一个同名的函数,它接受重新声明。但是当我们在一个块内做同样的事情时,它显示重新声明错误.
Code:

var x;
function x() {}; // no error.

但在这种情况下我收到错误。

{
  var inside; // re-declaration error.
  function inside() {};
}

预期结果应该没有错误。


这是 EcmaScript 6 的更改。从 ES6 开始,不再允许有重复的绑定在块范围内.

The ES5 spec没有这样的限制,但在ES6 spec语义已更改:

13.2.1 静态语义:早期错误

Block : { 声明列表 }

  • 如果 LexicallyDeclaredNames 是一个语法错误声明列表包含任何重复的条目。

  • 如果 LexicallyDeclaredNames 的任何元素是语法错误声明列表也出现在 VarDeclaredNames 中声明列表.

第一部分是相关的 -LexicallyDeclaredNames包含块内代码中找到的所有声明。

据推测,这是 ES6 中函数声明语义变化的一部分,因为现在它们可以是块作用域的:

{ //block 1
  function foo() { // declared in block 1
    return 1;
  }
  console.log("block 1: foo() === 1", foo() === 1);
  
  { // block 2
    function foo() { // declared in block 2
      return 2;
    }
    console.log("block 2: foo() === 2", foo() === 2);
  }
  
  console.log("block 1: foo() === 1", foo() === 1);
}

这是等效 ES5 代码的语法糖:

(function() { //block 1
  var foo = function() {
    return 1;
  }
  console.log("block 1: foo() === 1", foo() === 1);
  (function() { //block 2
    var foo = function() {
      return 2;
    }
    console.log("block 2: foo() === 2", foo() === 2);
  })();
  console.log("block 1: foo() === 1", foo() === 1);
})();

但是,此功能无法处理重复的名称。

对于任何块,包括其他类型的块语句,都存在相同的行为。这是一个例子:

{ //block
  function foo() { return 1; }
  console.log("block: foo() === 1", foo() === 1);
  
  if (true) { // if block
    function foo() { return 2; }
    console.log("if block: foo() === 2", foo() === 2);
  }
  
  for (var i = 0; i < 1; i++) { // for block
    function foo() { return 3; }
    console.log("for block: foo() === 3", foo() === 3);
  }
  
  switch ("hello world") { // case block
    default:
      function foo() { return 4; }
      console.log("case block: foo() === 4", foo() === 4);
  }
  
  console.log("block: foo() === 1", foo() === 1);
}

但需要注意的是,同一内容的重复声明type (var or function)不会导致错误:

{
  var foo = 1;
  var foo = 2;
  
  console.log("foo ->", foo);
}

{
  function bar() { return "a"; }
  function bar() { return "b"; }
  
  console.log("bar() ->", bar());
}

所以,他们似乎没有被视为不同的声明,但覆盖相同的词法声明名称。

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

同名的变量和函数在块内返回错误 的相关文章

随机推荐

  • 如何使用存储删除然后恢复非索引更改,而不会在 git 中出现合并冲突?

    我希望能够使用索引的当前状态运行项目测试 忽略未提交的工作更改 我稍后计划将其添加到预提交挂钩中 但是 我无法弄清楚如何以永远不会导致合并冲突的方式删除然后恢复非索引更改 我需要这个 因为它是由脚本运行的 所以完成后它不应该改变存储库状态
  • 使用 Ruby 从 HTML 文档中删除文本

    有很多关于如何使用 Ruby 从文档中删除 HTML 标签的示例 Hpricot 和 Nokogiri 都有 inside text 方法 可以轻松快速地为您删除所有 HTML 我想做的恰恰相反 从 HTML 文档中删除所有文本 只留下标签
  • javascript 中的正则表达式非捕获组

    我对我的正则表达式和 JavaScript 有点生疏 我有以下字符串变量 var subject javascript loadNewsItemWithIndex 5 null 我想提取5使用正则表达式 这是我的正则表达式 loadNews
  • PHP 将 GMT 转换为 IST [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我可以在 PHP 中将 GMT 转换为 IST 而不使用 PEAR 这是我如何获
  • R 闪亮的双向反应式小部件

    我正在努力弄清楚如何让 2 R Shiny 小部件相互更新 例如 可以更新文本框小部件的滑块小部件 反之亦然 最终用户可以选择使用任一小部件 这个问题很相似 但没有答案 所以我给出 希望 一个更简单的例子 检索由shiny reactive
  • pytorch 摘要因 Huggingface 模型而失败

    我想要一个总结PyTorch从huggingface下载的模型 我在这里做错了什么吗 from torchinfo import summary from transformers import AutoModelForSequenceCl
  • 在 LINQ 中按月和年分组多个日期属性

    我需要按月份和年份对多个属性进行分组C LINQ 这是我的代码 public class Class1 public Nullable
  • 如何在 cabal 测试中使用detailed-0.9

    我在让单元测试在阴谋集团下运行时遇到了令人惊讶的困难 我已经逐字复制了测试代码阴谋集团文档 除了更改模块名称 LANGUAGE FlexibleInstances module Test Integral tests where impor
  • 如何解析sample1的响应以在JMeter中创建新示例

    我使用JMeter来做Web服务器的性能测试 我的测试用例如下 step1 send file update request to server step2 server will return some files URL as html
  • 阻止用户在网站上多次投票

    我计划在我运行的网站上添加一些投票赞成 反对投票按钮 这看起来很简单 但我想阻止人们多次投票 一种解决方案是让他们在投票之前进行注册 但我不希望强迫他们注册 有没有一种相当简单的方法可以做到这一点 检查 IP 地址似乎不是一个好的解决方案
  • 使用 type() 手动创建新类时,子类 __module__ 设置为元类模块

    在下面的示例中 新创建的子类最终成为元类 module 而不是父类的模块 我只在使用时见过这种情况ABCMeta所以这可能是该模块特有的东西 有人知道会发生什么吗 In 1 from abc import ABCMeta In 2 clas
  • termios VMIN VTIME 和阻塞/非阻塞读取操作

    我正在尝试为 Linux 编写一个简单的 C 串行通信程序 我对阻塞 非阻塞读取和 VMIN VTIME 关系感到困惑 我的问题是 我是否应该根据是否有阻塞 非阻塞开放调用来设置 VMIN VTIME 例如 如果我有以下公开征集 open
  • 在 Google App Engine Python SDK 上使用 RSA 私钥对字符串进行签名

    是否有任何已知的方法可以在 Google App Engine Python SDK 上使用 RSA 私钥对纯文本字符串进行签名 gdata python 库中包含的 tlslite 库是一个不错的选择 http code google c
  • 更改 JPanel 及其所有元素的字体大小

    我正在尝试创建一个 Swing 面板 其元素的字体大小与 swing 应用程序的其余部分不同 最初 使用setFont对于几个组件来说没有造成任何问题 现在我有几个组件 及其所有子组件 所以这个解决方案是不切实际的 我搜索过有关更改 swi
  • .net 4.0 代码合同。什么时候使用?他们什么时候浪费时间了?

    我一直在研究 NET 4 0 代码契约 并在 stackoverflow 上查找与此相关的问题 我仍然从未遇到过任何使用代码契约的示例代码 这让我想知道 这真的有用吗 或者也许它是您的代码达到一定复杂性时唯一有用的一个 有人使用代码合约并且
  • 在 Wordpress 中处理序列化数据

    我在 WordPress 自定义字段中有以下序列化数据字符串 first string a 9 s 5 email s 13 email protected s 4 name s 15 Werner Etsebeth s 8 address
  • 无法从Listview的EditText获取值?

    我正在尝试从列表视图中的 EditText 获取数据 我看到了很多类似的问题并得到了solution 但它在我的实现中引发了 NPE 所以请指导我解决这个问题 Adapter public class Coscho adapter exte
  • Visual Studio Code - 可以对 python 进行实时 linting 吗?

    这里有同样的问题 但还没有任何答复 使用 VSCode 对 Python 进行实时 linting 我现在正在使用 VS code 市场上的 Python 扩展 经过大约一个小时的研究 我在 linter 中发现了以下选项 python l
  • 如何在 Eclipse 中将源附加到 Google Drive API 或“Android Private Library”

    我已经安装了驱动API使用Add Google APIs 菜单选项 当手动钻入下面的任何一个罐子时驱动API 源代码打开正常 但手动钻入同一个罐子下Android Private Libraries结果是 未找到源 所以使用时open De
  • 同名的变量和函数在块内返回错误

    如果我们声明一个变量和一个同名的函数 它接受重新声明 但是当我们在一个块内做同样的事情时 它显示重新声明错误 Code var x function x no error 但在这种情况下我收到错误 var inside re declara