当前位置: 首页 > 面试题库 >

为什么在Angular 1.3中将全局函数视为“错误”

胡安怡
2023-03-14
问题内容

传统上,我是这样管理Angular代码的

//File 1
angular.module('name',[])
//File 2
function TestController(){

}
TestController.prototype.// inherited stuff
angular.module('name').controller('testController',TestController);

这非常有效,使我可以轻松地对文件进行分区。现在,我尝试升级到1.3,并声名狼藉…

Error: [ng:areq] Argument 'TestController' is not a function, got undefined

当然,这是由于此更改要求清除人们编写代码的方式所致。那么这种模式会更复杂吗?有没有办法在不更改全局设置的情况下维持这种模式?


问题答案:

您链接到的页面上实际上有一个注释,其中有一个相当扎实的解释。

全局控制器是指将您的控制器定义为窗口对象上的函数。这意味着它们可以公开地与恰好定义一个具有相同名称的函数的任何其他JavaScript冲突。诚然,如果使用…
Controller对控制器进行后期修复,那么这很可能不会发生,但是总会有机会,尤其是如果您要使用许多第三方库。将这些控制器功能放在模块安全性内部要安全得多。然后,您可以更好地控制此模块的加载时间和位置。不幸的是,控制器名称在单个Angular应用程序中是全局的,因此您仍然有可能发生冲突,但是至少您不能与JavaScript全局命名空间中的完全不同的代码发生冲突。

因此,想法是全局控制器功能可能会与您使用的任何JavaScript中的任何其他全局函数发生冲突。因此,为避免与您自己的代码或第三方脚本发生冲突的机会,不使用全局控制器会使您的代码更安全,更一致。

如@Brett的评论中所述,您可以在原型设计中使用IIFE。这是使用该插件的更新。主要更改如下所示。

(function() {
  TestController.prototype.name = 'World'
})();


 类似资料:
  • 问题内容: 我一直看到警告,不要在JavaScript中使用全局变量,但是似乎人们说这的唯一原因是因为阻塞了全局名称空间。我可以想象通过将所有变量放入一个大对象中来轻松解决此问题。现在的问题是:除了方便起见,还有其他原因不使用全局变量吗?它们是否涉及任何性能或兼容性问题? 问题答案: 它们使全局名称空间混乱,并且查找速度比局部变量慢。 首先,拥有许多全局变量始终是一件坏事,因为很容易忘记您在某个地

  • 问题内容: 我目前遇到一个问题,我有两个我需要调用的模块,它们需要能够修改相同的变量。 我决定创建一个名为的全局变量,并在其中存储所需的变量。 但是我一直在阅读,使用全局变量是一种不好的做法。为什么? 我仅创建一个变量,该变量不应与其他任何冲突,因为它是我的应用程序的名称。 问题答案: 几乎在所有编程语言中,全局变量都被视为反模式,因为它们使遵循和调试代码变得非常困难。 浏览代码时,您永远不知道哪

  • 我试图理解将jwt存储在本地存储(倾向于xss)与cookie(倾向于csrf)的安全含义。我想了解如果我将jwt令牌存储在前端的应用状态中的安全性影响,就像在redux商店中一样。 编辑: 我试图了解有关存储代币的更多信息。似乎所有的文章和答案实际上都是在确定有两种方法可以做到这一点后开始讨论的,即cookie或浏览器存储。像这样一个相关的问题:在浏览器中的何处存储JWT?如何防范CSRF?像这

  • 例如,我有: 有没有办法将和导出为全局函数,这样我就可以直接调用,而不是? 我的上下文是使用Rhino/Nashorn脚本引擎,我想注入一个提供全局函数的“全局”对象。

  • 问题内容: 这是一个奇怪的行为。 尝试这个 : 为什么列表不需要全局声明?它们是自动全局的吗? 我发现它真的很奇怪,我大多数时候都使用列表,甚至根本不使用global作为全局… 问题答案: 它不是自动全局的。 但是,和之间存在区别-前者重新绑定了name ,因此需要使用它来防止创建相同名称的本地插槽。在后一种情况下,您只是在修改现有的全局对象,该对象可以通过常规名称查找找到(更改列表条目就像在列表

  • 问题内容: 目前,我正在研究Sams出版的《 24小时自学Android应用程序开发》一书。我是Java,Android或其他方面的新手。我在ActionScript 3中具有非常扎实的背景,该语言与Java具有足够的相似性,因此该语言本身并不难掌握,但对于本书中某些代码示例的基本原理,我仍然存在一些疑问。例如,以下是第9小时的示例代码随附的函数: 在此函数签名中,作者已将scoreTable参数