Глобальные и локальные и частные функции (Javascript) - PullRequest
7 голосов
/ 15 февраля 2012

В настоящее время я читаю книгу о Javascript от Pragmatic, и меня смущает одна вещь.У них есть раздел о том, как сделать переменные глобальными, локальными или приватными.

  1. В чем разница между локальными и приватными переменными?Есть ли один?

  2. Как создать переменную глобальную или локальную? Они сказали что-то о том, что перед ней стоит 'var =', но это было очень расплывчато.

Ответы [ 6 ]

8 голосов
/ 15 февраля 2012
  1. Нет, люди используют «личное», потому что они ошибаются и должны сказать «локальные»

  2. локальные переменные определены как

var foo = "local";

глобальные переменные - это свойства объекта глобальной области видимости (который в браузере равен window)

window.foo = "global";

Тот факт, что вы можете сделать foo = "global"; без предварительного объявления переменной foo с var foo, является "ошибкой".Это исправлено в строгом режиме ES5.

(function () { "use strict"; foo = 42; })()

дает ReferenceError: foo is not defined

Обратите внимание, что вы можете сделать переменные глобальными, объявив их в самой внешней области видимости

var foo = "global";
function bar() {
  var foo = "local";
}

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

4 голосов
/ 15 февраля 2012

В контексте браузера ключевое слово var устанавливает переменную в соответствие текущей функции.

var a = 10;

var b = function(a) {
   console.log(a);  # 15
}

b(15);
console.log(a);  # 10

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

Переменная считается закрытой, если она существует только внутри области действия функции. Это обычно принимает форму анонимной функции. На самом деле это не частная переменная в обычном смысле этого слова, это просто локальная переменная.

(function() {
  var x = 10;
})();

console.log(x); #undefined
0 голосов
/ 09 августа 2018

Я нахожу все ваши ответы очень странными, так как я думал, что они следующие:

    /* A globally scoped and public variable */
    var globalVariable = 'global';
    /* A globally scoped and public constructor */
    function Obj() {
        /* private */
        /* A locally scoped and private variable */
        var privateVariable = 'private';
        /* A locally scoped and private method */
        privateMethod = function() {
            return privateVariable;
        }
        /* public */
        /* A locally scoped and public variable */
        this.publicVariable = 'public';
        /* A locally scoped and public method */
        this.publicMethod = function() {
            console.log(privateVariable + ' ' +
                privateMethod() + ' ' +
                globalVariable + ' ' +
                this.publicVariable);
        }
    };
    /* A globally scoped and public object */
    var obj = new Obj();
    /* displaying various variables and calling methods */
    console.log(globalVariable); // global
    console.log(obj.privateVariable); // undefined
    /* if uncommented will display : ReferenceError: privateVariable is not defined */
    // console.log(privateVariable);
    /* if uncommented will display : TypeError: obj.privateMethod is not a function */
    // obj.privateMethod();
    privateMethod(); // nothing is displayed
    console.log(obj.publicVariable); // public
    obj.publicMethod(); // private private global public
0 голосов
/ 15 февраля 2012

Закрытые переменные имеют смысл только при создании объектов.Типичный шаблон прототипа позволяет добавлять любые необходимые переменные и вспомогательные функции в качестве свойств экземпляра объекта и / или его прототипа, но это имеет недостаток, заключающийся в том, что они становятся видимыми для любого, кто имеет доступ к объекту.Чтобы избежать этого, существует альтернативный шаблон, в котором переменные являются локальными переменными конструктора, и все методы объявлены в области конструктора, и только общедоступные присваиваются в качестве фактических свойств объекта.

0 голосов
/ 15 февраля 2012

Javascript имеет область действия функции, любая переменная, определенная внутри функции с ключевым словом var, является локальной для функции и не видна снаружи.Переменные, определенные в функции без ключевого слова var, являются глобальными и видны везде.

function test(){
  var local = 'local'; // this is local
  global = 'global'; // this is global
}

test(); // call a function

alert(local) // undefined
alert(global) // global
0 голосов
/ 15 февраля 2012

В чем разница между локальными и частными переменными?Есть ли один?

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

Как сделать переменную глобальной или локальной, они сказали что-то о том, что перед ней стоит 'var =', но это было очень расплывчато.

Когда вы ставите var перед переменной, она становится локальной переменной, а при отсутствии становится глобальной переменной.Например:

var foo = 1; // local
foo = 1; // global equivalent to window.foo = 1 becomes part of window object

Более практичный пример:

function myfunc(){
  var foo = 1; // presence of var keyword
  bar = 2;     // absence of var keyword
}

alert(foo); // error eg undefined
alert(bar); // 2 because bar is part of window global object
...