2015-04-08 5 views
4

Я новичок в js и пытаюсь понять глобальные и частные функции. Я понимаю глобальные и локальные переменные. Но если у меня есть html с именем test.html и 2 js-файлами с именем test1.js & test2.js. Теперь я включаю test1.js & test2.js в test.html и вызываю функции, написанные в test2.js внутри test1.js и test.html.Глобальные функции в javascript

Функция, которые я написал в test2.js в этой форме

функция а() {...}

функция PQR() {...} и т.д.

являются ли эти функции глобальными? Если да, то как я могу не сделать их глобальными и до сих пор обращаться к ним в test1.js и test.html?

Как я читал глобальные функции или глобальные переменные, это плохо?

+0

Область применения не имеет ничего общего с тем фактом, что они находятся в разных файлах JavaScript. Проведите простой тест. Поместите функцию в test1 и вызовите ее из test2. Это работает? – epascarello

+0

почти точно так же, как и глобальные переменные. Если у вас есть объявление var на «верхнем уровне», то эта переменная будет свойством глобального объекта - то же самое с функциями, которые вы определили с ключевым словом функции. – doldt

+0

Что вы имеете в виду? – ugandajs

ответ

10

Все в JS связано с объемом. Поэтому, если вы определите function непосредственно в файле, он будет привязан к объекту window, то есть он будет глобальным.

Чтобы сделать это «частным», вам необходимо создать объект, который будет содержать эти функции. Вы правы, что засорение глобальной области является плохим, но вы должны положить что-то в глобальную область, чтобы иметь доступ к ней, библиотеки JS делают то же самое, и нет другого способа обхода. Но подумайте о том, что вы поставили в глобальном масштабе, для вашей «библиотеки» должен быть более чем один объект.

Пример:

MyObject = { 
    abc: function(...) {...}, 
    pqr: function(...) {...} 
    // other functions... 
} 

Для вызова abc где-то, будь то тот же файл или другой файл:

MyObject.abc(...); 
+0

Вы также можете сделать функцию private с помощью 'var':' var mySuperAwesomeFunction = function() {}; ' – Jordumus

+0

да, но если вы не будете писать var перед abc, тогда abc по-прежнему является глобальным и доступен как abc() from другие файлы. Верный? Тогда в чем смысл? – ugandajs

+0

@ugandajs no: функции 'abc' и' pqr' будут доступны только из элемента 'MyObject', если вы используете это обозначение. – Jordumus

2

Все, что определено в файле без какой-либо обертки будет привязан к окну объект. Любой бой к объекту окна является глобальным.

Пример:

//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); 
+0

В примерах нет необходимости в '.call', конечный'() 'достаточно (т.е.' (function() {...}()) '. – RobG

+0

Я знаю. Я разработчик coffeescript, и я привык видеть его таким образом. –

0

Если вы не понимаете, почему глобальные переменные являются плохими, то почему вы пытаетесь их избежать?

Глобальные функции не обязательно являются плохими. Что плохо, так это то, что кто-то и что-то изменил.

В общем, поскольку вы новичок в Javascript, все в порядке, чтобы начать с глобальных функций, распространяемых через несколько файлов javascript, которые вы добавляете в свой html-файл, с помощью тегов скриптов.

По мере перехода от новичка к промежуточному, вам нужно будет изучить некоторое «модульное» решение (я лично рекомендую RequireJS).

В настоящее время, хотя, вы можете сделать с более простым рисунком модуля:

var T1 = function() { 
    return < some module object > 
})(); // notice the parenthesis 

Google "Javascript шаблон модуля".

См. Также this answer.

1
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

+0

Вы также можете 'return {function1: function1, function2: anotherFunction}' и сохранить себя от повторения параметров. – FercoCQ

+0

Это правда, спасибо. – fellak