Javascript 在Angular中声明全局应用程序变量是否不好?
我在网上看到了许多示例,其中显示了以下基本AngularJS代码: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(... 这会
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(“示例”)
完全正确。仍然有效。