Глобальные, локальные и частные функции (Javascript)

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

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

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

6 ответов


  1. нет, люди используют "частный", потому что они ошибаются и должны сказать "местный"

  2. локальные переменные определяются как

var foo = "local";

глобальные переменные-это свойства объекта global scope (который является 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";
}

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


в контексте браузера ключевое слово 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

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

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

как сделать переменную глобальной или локальной, они что-то сказали о том, чтобы поставить перед ним "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

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

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


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

    /* 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