Javascript 作为全局变量的角度和参数之间的差异?

Javascript 作为全局变量的角度和参数之间的差异?,javascript,angularjs,Javascript,Angularjs,我写了一本书。我犯了一个严重的错误。我徘徊着去修理它。最后,我解决了这个问题。。。没有理由。所以我需要下面的代码问题明确的描述 这是我的代码A: angular .module('BinD', ['ngSails']) .factory('UserService', function ($sails) { ... }); 另一个B是: (function (angular) { 'use strict'; angular

我写了一本书。我犯了一个严重的错误。我徘徊着去修理它。最后,我解决了这个问题。。。没有理由。所以我需要下面的代码问题明确的描述

这是我的代码A:

    angular
    .module('BinD', ['ngSails'])
    .factory('UserService', function ($sails) {
        ...
    });
另一个B是:

(function (angular) {
    'use strict';

    angular
    .module('BinD', ['ngSails'])
    .factory('UserService', function ($sails) {
        ...
    });
})(angular);
错误部分是:

(function (angular) {
'use strict';

angular
    .module('BinD', ['ngSails'])
    .controller('SignUpCtrl', function ($scope, $window, UserService) {

代码B运行良好。编写错误消息“UserServiceProvider未知(可能?)”的代码。我真的不知道为什么两个相同的代码工作方式不同。让我知道。

在您的代码A代码B的两部分中,您创建了一个依赖于ngSails的模块BinD,然后向该模块注册工厂,但是代码A将全局声明一个变量,如果您正在使用它&代码B将使用IIFE模式进行编码,这将使您的变量仅在声明的函数中可用。但这与你所犯的错误无关

在控制器内部,您希望利用该工厂,但在创建
控制器时,您不应该像创建
angular.module('BinD',['ngSails'))
那样创建新模块,这将刷新以前注册的工厂(或其他组件)使用
BinD
模块,将创建一个名为
BinD
的新模块。这就是为什么在控制器中注入
UserService
后抛出
$injector
错误的原因,因为
UserService
在该模块中不可用

控制器

(function (angular) {
'use strict';

angular
    .module('BinD') //<- utilizing already created module
    .controller('SignUpCtrl', function ($scope, $window, UserService) {
(函数(角度){
"严格使用",;
有棱角的

.module('BinD')/在函数中包装.code>factory
调用不应该有任何区别。我想您一定也做了不同的更改

在第三个代码段中,当您使用两个参数调用
.module
时,您将创建一个新模块。这将覆盖您在“代码a”或“代码B”中创建的模块

您不是在重复使用同一个模块,而是在创建一个新模块。因此,新模块上不存在您的用户服务是有道理的。

您的最后一个代码片段应该只使用一个参数调用
.module('BinD')
。只需使用您想要使用的模块的名称

angular
    .module('BinD')
    .controller('SignUpCtrl', function ($scope, $window, UserService) {

另一个选项是只调用
.module
一次,然后保存它

var app = angular.module('BinD', ['ngSails']);

然后,您可以调用
app.controller
app.factory
,而不必担心语法。

Aha,所以我声明不同的模块“绑定”并且模块必须由外部变量管理。是吗?您的第二种方法在他的情况下永远不会起作用。。在第二部分中,他使用IIFE模式。@user3413534您可以管理如果你觉得更简单的话,可以将它放在外部变量中。这通常是我所做的。@PankajParkar,是的,显然
app
变量需要在引用它的范围内。所以要么使用window.app或$window.app,要么从iLife返回它。@BuhBuh那么还有其他的前进方式吗?我的大脑不会想象其他方式。