Я немного новичок в 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
Спасибо!
Ответ 1 · рейтинг 7 · mpm
шаблон модуля:
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"
Ответ 3 · рейтинг 4 · Mattias Buelens
Если вам на самом деле не нужно выставлять какую-либо из ваших переменных в глобальную область, вы можете обернуть весь свой код 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.
Ответ 4 · рейтинг 1 · alfonsob
Хотя это и не прямой ответ на ваш вопрос, это связано и важно, так как его отсутствие может загрязнить другие модули. Если вы не используете ключевое слово 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
})()
Я надеюсь, что я не продублировал то, что кто-то сказал выше, но я не видел, чтобы это упоминалось