Как должен выглядеть внешний файл JavaScript, чтобы избежать глобальных переменных и методов? - PullRequest
2 голосов
/ 11 октября 2011

У меня есть следующий фрагмент кода на моей странице:

<script src="/Assets/JavaScripts/myJavaScript.js" type="text/javascript"></script>

<script type="text/javascript">

     testAlert();

</script>

И в myJavaScript.js у меня есть следующее:

(function () {
     function testAlert() {
          alert('test alert');
     }
})();

Это не вызов testAlert.Не уверен, что я здесь не так делаю?Я пытаюсь избежать глобальных переменных и методов.Я сделал что-то похожее в jQuery, и это сработало, просто потребовалось $ в начале внешнего файла.Кто-нибудь может объяснить, пожалуйста, что я делаю здесь неправильно и как убедиться, что я следую лучшим рекомендациям?

Ответы [ 4 ]

2 голосов
/ 11 октября 2011

Я поместил ваш код в свою среду и проверил, я получил ошибку в консоли ошибки mozila.Итак, пожалуйста, проверьте это там.Вы должны поместить только ниже функцию JavaScript в файл myjavascript.js.

function testAlert() {
    alert('test alert');
}
1 голос
/ 11 октября 2011

Ваша функция в js-файле ничего не возвращает.Чтобы избежать глобальных переменных, вы можете создать одну глобальную (-подобную) переменную пространства имен:

var myNS = (function () {
     function testAlert() {
          alert('test alert');
     }
     return {testAlert:testAlert};
}());

Теперь вы можете использовать myNS.testalert() во встроенном JavaScript.

0 голосов
/ 11 октября 2011

Вам нужна некоторая глобальная переменная , чтобы вы могли получить доступ к нужному методу.Тот факт, что у вас есть <script>testAlert()</script>, означает, что вы ожидаете определения testAlert() в глобальном пространстве имен.

Что мне нравится делать (особенно при использовании YUI, которым вы пометили этот вопрос)создайте глобальный объект, который действует как служебный класс.

var page = {
    init: function() {
        // Do some initialization...
    },
    testAlert: function() {
        alert("Test Alert");
    }
};

После этого вы можете использовать одну глобальную переменную "page" для доступа ко всему, что вам нужно.Опять же, для второго примера я предполагаю, что вы используете YUI, поскольку вы пометили этот вопрос им.

0 голосов
/ 11 октября 2011

JS сделан таким образом, что вы действительно не можете полностью избегать глобалов.(Ну, вы можете, в некотором роде. Если вы никогда ничего не даете имени. Но это имеет тенденцию вызывать больше проблем, чем решает.) Когда вы вызываете testAlert из какого-то другого сценария, вы работаете в предположении, что testAlert является глобальным.Если бы это было не так, вы не могли бы просто вызвать его откуда-либо подобным образом.

Однако вы можете минимизировать вероятность столкновения, добавив свои вещи к объекту, который служит пространством имен, например:

// don't clear it out if it already exists.
// that way all of your scripts can use your namespace, if you want.
// what you're really trying to protect against, are strangers picking names
// like yours. 
if (!window.myNamespace) myNamespace = {};

// example function
myNamespace.testAlert = function() { alert("test alert"); };


myNamespace.testAlert();

Таким образом, единственное имя, которое имеет хорошие шансы на конфликт, - это myNamespace.

Я собирался показать пример глобального пространства имен ... но вы знаете,что?Глобальное пространство имен все еще глобально .Глобальные переменные - это то, от чего вы хотите избавиться в большинстве случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...