Глобальные функции в javascript
Я новичок в JS и пытаюсь понять глобальные и частные функции. Я понимаю глобальные и локальные переменные. Но если у меня есть HTML с именем test.html
и 2 js файлами с именем test1.js
и test2.js
. Теперь я включаю test1.js
и test2.js
в test.html
и вызываю функции, написанные в test2.js
внутри test1.js
и test.html
.
Функции, которые я написал в test2.js, находятся в этой форме
function abc(){...}
function pqr(){...} etc.
Являются ли эти функции глобальными? Если они есть, как я могу не сделать их глобальными и при этом обращаться к ним в test1.js
и test.html
?
Как я прочитал глобальные функции или глобальные переменные не так ли?
Ответы
Ответ 1
Все в JS связано с областью. Поэтому, если вы определяете function
непосредственно в файле, он будет привязан к объекту window
, т.е. Будет глобальным.
Чтобы сделать это "private", вам нужно создать объект, который будет содержать эти функции. Вы правы, что засорение глобальной области является плохим, но вы должны положить что-то в глобальную область, чтобы иметь доступ к ней, библиотеки JS делают то же самое, и нет другого способа обхода. Но подумайте о том, что вы указали в глобальной области, для вашей "библиотеки" должен быть более чем один объект.
Пример:
MyObject = {
abc: function(...) {...},
pqr: function(...) {...}
// other functions...
}
Для вызова abc
для где-то, будь то тот же файл или другой файл:
MyObject.abc(...);
Ответ 2
var SomeName = function() {
var function1 = function (number) {
return number+1;
}
var anotherFunction = function (number) {
return number+2;
}
return {
function1: function (number) {
return function1(number);
},
function2: function (number) {
return anotherFunction(number);
}
}
}();
вызов
console.log(SomeName.function1 (1));//logs 2
console.log(SomeName.function2 (1));//logs 3
Ответ 3
Все, что определено в файле без какой-либо оболочки, будет привязано к объекту окна. Все, что связано с объектом окна, является глобальным.
Пример:
//these are global variables
foo = 123;
var ABC = 'school';
//these are "private" variables
test = function(){
var foo = 123
}
(function(){
var ABC = 'school';
}).call(this);
Поскольку глобальные переменные в каждом файле будут частью объекта window
, вы можете обращаться к ним между файлами. Это важно при создании "приватных" переменных, которые вы добавляете var
. Это говорит о переопределении любых глобальных переменных в текущей "оболочке". Если у меня есть глобальная переменная foo
и я снова определю ее в функции с var
они будут разделены.
var foo = 123;
(function(){
var foo = 987; //this foo is separate from the above foo
}).call(this);
Если у вас есть "обертка" и вы хотите определить глобальную функцию, вы можете сделать это следующим образом:
window.foo = 123;
(function(){
window.foo = 123;
}).call(this);
Обе функции будут делать то же самое.
Лично я предпочитаю помещать все в обертку и определять глобальные переменные только тогда, когда они мне нужны, используя window
.
(function(){
//all code goes here
//define global variable
window.foo = 123;
})call(this);
Ответ 4
Если вы не понимаете, почему глобальные переменные являются плохими, то почему вы пытаетесь их избежать?
Глобальные функции не обязательно плохие. Что плохого в том, что кто-то и что-то изменил.
В общем, поскольку вы новичок в Javascript, хорошо начать с глобальных функций, распространяемых через несколько файлов javascript, которые вы добавляете в свой html файл с помощью тегов script.
Когда вы переходите от новичка к промежуточному, вам нужно будет изучить некоторое "модульное" решение (я лично рекомендую RequireJS).
Пока что вы можете сделать более простой шаблон модуля:
var T1 = function() {
return < some module object >
})(); // notice the parenthesis
Google "Шаблон модуля Javascript".
Также см. этот ответ.