Javascript 为什么angularjs需要IoC/DI?

Javascript 为什么angularjs需要IoC/DI?,javascript,angularjs,dependency-injection,inversion-of-control,Javascript,Angularjs,Dependency Injection,Inversion Of Control,在这个问题之后 因此Python不需要IoC/DI,因为它已经是动态脚本语言了 Javascript也是一种动态脚本语言,为什么呢 是因为JSON DOM是静态的吗?有人能给我举个简单的例子吗?Angular中的依赖注入(DI)不是一个必要的决定。大多数其他JavaScript框架都没有内置它。(尽管看一下木偶网,一个构建在Backbone.js之上的框架……它包括一个可选的DI层)。Angular.js附带了一组架构意见,可以帮助您分离代码。它是作为一种设计决策而建立的,而不是一种必要性 在

在这个问题之后

因此Python不需要IoC/DI,因为它已经是动态脚本语言了

Javascript也是一种动态脚本语言,为什么呢

是因为JSON DOM是静态的吗?有人能给我举个简单的例子吗?

Angular中的依赖注入(DI)不是一个必要的决定。大多数其他JavaScript框架都没有内置它。(尽管看一下木偶网,一个构建在Backbone.js之上的框架……它包括一个可选的DI层)。Angular.js附带了一组架构意见,可以帮助您分离代码。它是作为一种设计决策而建立的,而不是一种必要性

在Angular中使用DI的最大原因是因为Angular就是这样工作的。angular团队本可以决定使用一个异步模块定义(AMD)库,如Require.js。取而代之的是,他们选择了DI模式,并将其烘焙以方便使用

您发布的链接表明DI可能是动态语言中的反模式。我不同意这一点。我只想说,DI在动态语言中不太必要。然而,在角度的情况下,它工作得很好。它们允许你组成你的部件系统,在你需要的时候只注入你需要的东西。当你观察其他框架的做法时,它们(通常)只是在全局空间中命名它们的模型/视图/控制器/模板/路由器部分(比如Backbone.js中的App.Models.Person)


我发现DI在棱角分明,就像“在罗马时,按照罗马人的方式去做”。接受架构决策。感觉很好。

DI的最佳使用案例是当您通过测试构建一个非常大的应用程序时。在这种情况下,您可能是非常模块化的,有几十个组件可以组合在一起形成一个页面。JavaScript的经典问题是计时以及何时包含脚本,检查脚本是否已经加载,等等。DI消除了这一点。只要包含脚本——不管您喜欢什么,不管它是直接包含还是异步模块加载,还是捆绑包或组合——AngularJS都将处理其余部分。您不必担心顺序,因为AngularJS将为您遍历依赖关系树并以正确的顺序组装组件,您也不必担心生命周期管理,因为AngularJS将为您维护适当的实例。

首先,IoC和DI是两件不同的事情(DI是一种IoC,在静态语言中非常流行)。DI在python中不太流行,但其他IoC范例也很流行,如服务定位器。Django部分用作服务定位器(用于设置、缓存、存储等服务)

您需要记住,Javascript没有任何导入功能(html有,但Javascript本身没有,尽管它计划用于ES6),并且与python不同,如果您想构建具有复杂内部依赖关系的模块化应用程序,您在代码中没有任何方法来描述(或获取)依赖关系。
如果您不使用某种依赖关系管理框架(如require.js),您将被迫使用全局对象(或全局对象内的对象)作为服务定位器(其他框架和插件就是这样做的)


选择DI而不是angular中的服务定位器是一个设计决策,我猜这是因为两个主要原因决定的——第一个是单元测试,DI非常适合单元测试。第二个可能是未来的验证,比如。

我知道这是一个老问题,但因为仍然有很多人发现令人困惑的是,我想值得一提的是,使用DI方法可以完成的所有事情都可以使用普通的CommonJS来完成。或者至少以下几点:

  • 测试期间,注入测试加倍(重载require函数,如或
  • 在运行时替换服务(使用browserify
    导出
    要求
    选项)
我还没有发现依赖注入方法提供的东西的一个实例,它不能用普通的commonJS来完成

当然,如果你没有使用
commonJS
AMD
或其他模块化方法,你只有角度的方法,在这种情况下,你应该评估至少开始使用一种,它将使你的生活变得非常简单,而不需要DI


也就是说,DI是一个非常强大的概念,不可低估,只是Javascript不像其他语言那样需要它。

据我所知(misko和其他人在youtube上的一些谈话)AngularJS中的DI是一个经过深思熟虑的决定,而不是一种需要。主要是为了使测试更容易/可能。我不会说angular需要DI。它更多的是一个用于构建应用程序的附加工具。在facgt中,拥有DI是非常聪明和有用的。因为AngularJS可以通过_invokeQueue。如果没有它,仅仅使用dynamic language如何正确构造你的应用程序?+1关于DI的另一个伟大的观点。你可以在没有DI的情况下注入测试双倍,但是DI使它变得非常简单……我发现,在任何大型复杂的非平凡系统中,角度JS依赖注入最终都是一个非常简单的问题nti模式。举一个简单的例子,试着调试注入的依赖项的链接。这实际上是不可能的。依赖项注入的副作用是逻辑执行路径和调用路径变得不确定-这转化为“大量的bug”通过依赖注入做的任何事情都可以做得更简单,没有依赖注入。著名的格言:“任何聪明的傻瓜都可以把事情做得更大、更复杂,等等。”