【问题标题】:AngularJS identifier already declared error (with `let` statement)AngularJS 标识符已声明错误(使用 `let` 语句)
【发布时间】:2018-06-08 14:47:01
【问题描述】:

我在使用 AngularJS 时遇到问题,因为我在两个模板中重用变量名时会出现问题。我的设置的简化版本如下,route.js中声明的两个页面

$routeProvider.when('/a', {
  templateUrl: 'a.html'
})
.when('/b', {
  templateUrl: 'b.html'
})

每个页面(a.htmlb.html)都有一个类似这样的脚本标签

<script type="text/javascript">
  let foo = 5;
</script>

还有一个用于在页面之间导航的导航菜单。问题是当我从一页转到另一页时,我得到一个错误

Uncaught SyntaxError: Identifier 'foo' has already been declared

我知道我可以更改变量名,但我想知道为什么会这样,因为我的直觉是不应该这样。在 Angular 中使用脚本标签我错了吗?这可能是由其他原因引起的吗?谢谢

【问题讨论】:

标签: javascript angularjs ecmascript-6


【解决方案1】:

这里:

<script type="text/javascript">
  let foo = 5;
</script>

您是在全局范围内声明变量,而当您触发第二条路由时,您是在重新声明已经在同一范围内的同一个变量。

避免使用脚本标签并使用控制器本地范围,在那里声明变量,你不会有任何冲突。

function aController (){
  let foo = 5;
}

function bController (){
  let foo = 5;
}

或者,如果您想保留脚本块,请将代码包装在 IIFE 中以避免与全局范围混淆。

<script type="text/javascript">
  (function(){
     let foo = 5;
  })()
</script>

【讨论】:

  • 所以我需要在route.js 的两个页面中添加控制器?
  • 好吧,我不知道您的业务逻辑,问题是您应该避免更改全局范围以避免这些类型的错误。你甚至可以在脚本块中使用 IIFE 来使用函数的范围而不是全局
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多