Ich habe eine AngularJS-App geerbt, die ein anderer Entwickler entwickelt hat. Und jetzt soll ich diese App weiterentwickeln und unterstützen.Korrekter Weg zum Einrichten einer AngularJS-Anwendung im globalen Namespace?
Eine Sache, die ich sofort bemerkte, war die Art und Weise, in der er seine App und Controller deklarierte, nicht die Syntax IIFE (sofort aufgerufener Funktionsausdruck) verwendete oder die App und Module Variablen zuwies.
Er erklärte alles in folgendem Format:
Die App-Modul:
'use strict';
angular
.module('app', [
'ngCookies',
'ngResource',
'ngRoute',
'ngTouch',
'ngSanitize'
}]);
Beispiel Controller:
'use strict';
angular.module('app')
.controller('newCtrl',
['$scope', function($scope) {
}]);
Statt etwas wie dies mit (IIFE):
(function() {
'use strict';
angular.module('app')
.controller('newCtrl');
})();
Oder diese:
var app = angular.module('app', [
"ngMessages",
"ngResource",
]);
Wird die von der vorherigen Entwickler verwendete Methode möglicherweise verschmutzt die globalen Namensraum mit Variablen usw. clashing?
Wie ich es verstehe, und IIFE ist nützlich, und aus den folgenden Gründen empfohlen:
Warum ?: Ein IIFE Variablen aus dem globalen Bereich entfernt. Dies hilft zu verhindern, dass Variablen und Funktionsdeklarationen im globalen Gültigkeitsbereich länger als erwartet leben, wodurch auch variable Kollisionen vermieden werden.
Warum ?: Wenn der Code für die Bereitstellung auf einem Produktionsserver verkleinert und in einer einzigen Datei gebündelt wird, können Kollisionen von Variablen und vielen globalen Variablen auftreten. Ein IIFE schützt Sie vor diesen beiden, indem Sie einen variablen Bereich für jede Datei bereitstellen.
Einige Fragen; Die Beispiele, die ich vom vorherigen Entwickler aufgelistet habe, sind nur der Grundriss. Was würde passieren, wenn es mehrere Controller gibt, die nicht in einem IIFE sind und dieselben Variablennamen haben? Würde es dann die Möglichkeit geben, dass andere Variablen im globalen Namensraum überschrieben werden? Beispiel: var a = 2 (in einem Controller namens newCtrl) und var a = 4 (in einem Controller namens oldCtrl). Oder wären die Variablen automatisch an ihre spezifischen Controller gebunden? – onmyway
Diese Variablen sind nicht im globalen Gültigkeitsbereich. Sie sind im Funktionsumfang. Dies ist die Qualität der JS-Funktionen, die IIFE ausnutzt (IIFE steht für sofort aufgerufenen * function * Ausdruck, richtig?). Die einzige Möglichkeit für eine Variable, vom Funktionsumfang in den globalen Namespace zu gelangen, ist die Eigenschaft 'window'. – estus
Ich verstehe, wie wichtig es ist, das IIFE zu verwenden, um die Variablen nicht zu verlieren, aber was ist, wenn man kein IIFE verwendet und die Variablen einfach in der Controller-Funktion enthalten sind - wären diese Variablen dann an diesen spezifischen Controller-Funktionsumfang gebunden, und nicht in der Lage zu lecken? – onmyway