Сделать переменную javascript доступной только для функций в том же файле .js

Я немного новичок в Javascript, и я застрял на этом одном элементе. Может кто-нибудь показать мне, как сделать переменную javascript доступной только для файла .js, в котором она находится.

ПРИМЕР:

Скажем, у меня есть два файла .js, PG1 и PG2. PG1 содержит var channel = Channel01;

PG2 содержит переменную с тем же именем, но с другим введенным значением Variable (часть после знака равенства) (var channel = Channel02)

Я не хочу, чтобы функция1 на PG1 использовала переменную на PG2 или чтобы функция2 на PG2 использовала переменную на PG1.

Я также вызываю эти функции с отдельной HTML-страницы.

Проблема: все мои функции в конечном итоге используют только одну переменную, независимо от того, на какой странице они находятся. (например, function1 и function2 используют var channel = channel01)

Вопрос: Как я могу ограничить функции на странице 1, чтобы использовать только переменные на этой странице .js

Спасибо!


person user1402171    schedule 17.05.2012    source источник


Ответы (4)


шаблон модуля:

var myModule = (function(exports){

    var x = "foo";

    exports.myFunction = function(){
        alert(x);
    };

})(typeof exports!="undefined" && exports instanceof Object ? exports : window );

myFunction будет доступно в области window в браузере.

ИЗМЕНИТЬ

цитирую автора: «Я также вызываю эти функции с отдельной HTML-страницы».

поэтому автору нужен глобальный доступ к функциям, которые он определяет.

var myModule не нужен и не экспортируется, это просто для совместимости с AMD:

(function(exports){

    var x = "foo";

    exports.myFunction = function(){
        alert(x);
    };

})(window);

теперь x для myFunction существует только в замыкании, но myFunction по-прежнему может обращаться к x в глобальной области видимости. любое определение x в глобальной области или любой другой области не повлияет на x = "foo"

person mpm    schedule 17.05.2012
comment
правда, но вы можете выбрать, что является глобальным, а что нет, и, кроме того, автору нужно вызывать некоторые функции вне файла. - person mpm; 18.05.2012
comment
как я только что написал, автору нужно вызывать некоторые функции вне файла, в котором они объявлены. но myFunction запомнит, где она была создана. - person mpm; 18.05.2012
comment
@Eli, если в глобальном масштабе вы сделаете var x = 3, myFunction все равно будет предупреждать foo, - person mpm; 18.05.2012
comment
@Eli, хорошо, я мог бы отказаться от myModule, это было бы то же самое, проблема не в моем модуле, проблема в функциях, использующих частные переменные, которые определены в замыканиях, поэтому ничто, кроме них, не может получить доступ к внутренним переменным. вы можете переопределить myModule, это не имеет значения. x = foo все равно будет существовать. Попробуйте перезаписать myModule и убедитесь сами. - person mpm; 18.05.2012
comment
Спасибо, Камю, за ответ :) Я попробовал синтаксис, на который вы ответили, но не могу понять, как вызвать myFunction. Я пытался использовать это: ‹script language=javascript›exports.myFunction()‹/script›. - person user1402171; 18.05.2012
comment
просто напишите: myFunction() и все должно работать. window является глобальной областью. - person mpm; 18.05.2012
comment
Спасибо за вашу помощь! :) Я сделал то, что вы сказали, и это прекрасно работает! - person user1402171; 18.05.2012

Оберните все это в выражение немедленно вызываемой функции, которое фактически даст файлу собственную область действия.

(function() {
   // Your file's contents live here.
})();
person alex    schedule 17.05.2012
comment
Спасибо всем, кто ответил! :) Я обнаружил, что первый ответ сработал лучше всего, но у меня есть еще один вопрос. Как мне вызвать одну из моих функций, которая вложена в выражение вызванной функции (например, на моей html-странице я хочу вызвать функцию 1, которая вложена в вызванную функцию). Еще раз спасибо - person user1402171; 18.05.2012
comment
@user1402171 user1402171 Вам необходимо явно указать эти функции в области, к которой может получить доступ ваш документ, например. window. - person alex; 18.05.2012

Если вам на самом деле не нужно выставлять какую-либо из ваших переменных в глобальную область, вы можете обернуть весь свой код JavaScript в мгновенно вызываемое функциональное выражение или IIFE. Здесь вы определяете выражение анонимной функции и немедленно вызываете его. В результате вместо того, чтобы загрязнять глобальную область видимости своими переменными, вы держите их в чистоте и порядке в локальной области видимости этой функции.

(function() {
    var channel = Channel01;

    // Put the rest of your PG1 code here, for example:

    function init() {
        channel.open();
    }

    init();
})();

Затем вы можете аналогичным образом обернуть свой код PG2 во IIFE. В результате два сценария не будут иметь общих переменных, кроме уже определенных глобальных переменных, таких как Channel01 и Channel02.

person Mattias Buelens    schedule 17.05.2012

Хотя это и не прямой ответ на ваш вопрос, это связано и важно, так как его отсутствие может загрязнить другие модули. Если вы не используете ключевое слово var, переменная находится в глобальной области видимости, т.е.

(function () {
   x = 'foo'; //x is on the global scope and can be seen everywhere
})()

(function () {
   var y = 'bar'; //y is local to this function
})()

Я надеюсь, что я не продублировал то, что кто-то сказал выше, но я не видел, чтобы это упоминалось

person alfonsob    schedule 07.01.2014