Javascript 在Angular中声明全局应用程序变量是否不好?

Javascript 在Angular中声明全局应用程序变量是否不好?,javascript,angularjs,Javascript,Angularjs,我在网上看到了许多示例,其中显示了以下基本AngularJS代码: var app = angular.module("ExampleApp", []); // setter, creates a new module app.controller(... 在同一角度模块下的其他文件中: var app = angular.module("ExampleApp"); // getter, retrieves the existing module app.service(... 这会

我在网上看到了许多示例,其中显示了以下基本AngularJS代码:

var app = angular.module("ExampleApp", []);  // setter, creates a new module

app.controller(...
在同一角度模块下的其他文件中:

var app = angular.module("ExampleApp");  // getter, retrieves the existing module

app.service(...
这会将一个全局“app”变量读入内存,该变量可以跨其他文件访问。如果我去掉了“getter”,直接从
app.service(…
)开始,第二个文件就可以工作了

我假设不使用getter而只是首先使用全局变量是一种不好的做法,但我想知道声明全局变量是否是一种不好的做法。我的第一个想法是将每个文件包装在一个iLife中,以局部地确定变量的范围,或者去掉
var-app
部分,然后将
.co链接起来控制器
服务
等,位于
angular.module()上


提前感谢您的专业建议。

这取决于您如何使用它有时我们需要全局使用,但有时不需要,但最好避免任何全局变量。这就是为什么在编写角度模块时,我们将使用自调用函数来避免访问全局值的原因。
换句话说,如果您没有太多的复杂性,您可以使用全局变量,但当您遇到复杂问题时,请避免使用它们,因为您可能使用多个框架,并且您的变量可能会与框架中的变量冲突,并且很容易导致甚至无法理解其发生原因的问题。

这取决于具体情况根据您如何使用它,有时我们需要全局使用,但有时不需要,但最好避免任何全局变量,这就是为什么在编写角度模块时,我们将使用自调用函数来避免访问全局值。
换句话说,如果您没有太多的复杂性,您可以使用全局变量,但当您遇到复杂问题时,请避免使用它们,因为您可能使用多个框架,并且您的变量可能会与框架中的变量冲突,并且很容易导致甚至无法理解其发生原因的问题。

作为全局变量变量在任何地方都是可变的,不使用全局变量更安全、更易于维护。我通常在第一个js文件中创建我的模块:

angular.module("ExampleApp", []);
并在不指定变量的情况下进入everyfile:

angular.module("ExampleApp")
    .service("MyService", function () {});

如果我需要一些变量,我使用函数:

(function () {
    var myController = function () {};

    myController.$inject = ["$scope"];

    angular.module("ExampleApp")
        .controller(myController);
})();
另外,使用诸如或之类的绑定器也是一个不错的选择。它们会根据js文件自动创建作用域。因此,您不需要使用立即调用的函数来隐藏全局作用域中的变量。例如:

var myController = require('./MyController.js');
var myApp = require('./ExampleApp.js');

myApp.controller(myController);

在这里,使用webpack,
myController
myApp
变量不是全局变量。简单明了…

由于全局变量在任何地方都是可变的,因此不使用全局变量更安全、更易于维护。我通常首先在js文件中创建模块:

angular.module("ExampleApp", []);
并在不指定变量的情况下进入everyfile:

angular.module("ExampleApp")
    .service("MyService", function () {});

如果我需要一些变量,我使用函数:

(function () {
    var myController = function () {};

    myController.$inject = ["$scope"];

    angular.module("ExampleApp")
        .controller(myController);
})();
另外,使用诸如或之类的绑定器也是一个不错的选择。它们会根据js文件自动创建作用域。因此,您不需要使用立即调用的函数来隐藏全局作用域中的变量。例如:

var myController = require('./MyController.js');
var myApp = require('./ExampleApp.js');

myApp.controller(myController);

在这里,使用webpack,
myController
myApp
变量不是全局变量。简单明了的…

会不会
app.myGlobal='hello world'
不起作用?这与任何其他类型的全局变量都是一样的问题。是的,它肯定会产生影响。在生产中,你可能确实会将其包装成一个iLife,可能您的实际生产Javascript构建系统在编译/打包Javascript时会这样做。您如何知道
var-app
是一个全局变量?您确定它不在(commonjs/ES6)模块中吗?我创建了一个快速示例应用程序,第一个文件使用
var-app=angular.module(“示例”,[])
在第二个文件中,我删除了
var app=angular.module(“示例”)
完全正确。仍然有效。
app.myGlobal='hello world'
不起作用吗?这与任何其他类型的全局变量都是一样的问题。是的,它肯定会产生影响。在生产环境中,您可能确实会将其包装在iLife中,可能您的实际生产Javascript构建系统在编译/打包时会这样做你的Javascript。你怎么知道
var-app
是一个全局变量?你确定它不在(commonjs/ES6)模块内吗?我创建了一个快速示例应用程序,第一个文件使用
var-app=angular.module(“示例”),第二个文件中删除了
var-app=angular.module(“示例”)
完全正确。仍然有效。