2012-05-12 2 views
0

Есть ли способ создать частные глобальные переменные в JavaScript? Я попытался оглядеться, и я продолжаю натыкаться на разговоры о конструкторах, которые не кажутся слишком глобальными.Способ сделать глобальные частные переменные в javascript?

Благодаря

+7

Что вы подразумеваете под «частными глобальными переменными»? Не могли бы вы привести пример? –

+2

это как сказать «глобальные переменные, которые не являются глобальными»? – Joseph

+0

Возможно, вы захотите прочитать о ближайших функциях: http://stackoverflow.com/questions/8475578/what-is-the-reason-for-this-javascript-immediate-invocation-pattern –

ответ

2

Не уверен, что вы используете. Я предполагаю, что у вас есть файл сценария js, содержащий некоторые функции и переменные, и вы хотите выставить некоторые из них по всему миру, но сохраните остальные в своем файле сценария. Вы можете добиться этого с закрытием. В основном вы создаете функцию, которую вы выполняете немедленно. Внутри функции вы помещаете исходный код. Затем вы экспортируете необходимые функции в глобальную область.

// Define a function, evaluate it inside of parenthesis 
// and execute immediately. 
(function(export) { 

    var myPrivateVariable = 10; 

    function myPrivateFunction(param) { 
    return param + myPrivateVariable; 
    } 

    export.myGlobalFunction = function(someNumber) { 
     return myPrivateFunction(someNumber); 
    }; 
})(this); // The *this* keyword points to *window* which 
      // is *the* global scope (global object) in a web browser 
      // Here it is a parameter - the *export* variable inside the function. 

// This is executed in the global scope 
myGlobalFunction(2); // yields 12 (i.e. 2 + 10) 
myPrivateVariable; // Error, doesn't exist in the global scope 
myPrivateFunction(2) // Error, doesn't exist in the global scope 
1

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

Как указано в комментариях к этому ответу, вы можете создавать объекты с частными членами. У Крокфорда есть страница на private members in Javascript. Он использует следующий код, чтобы проиллюстрировать свою точку зрения:

function Container(param) { 

    // private method 
    function dec() { 
     if (secret > 0) { 
      secret -= 1; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    this.member = param; 
    var secret = 3; 
    var that = this; 

    // privileged method 
    this.service = function() { 
     return dec() ? that.member : null; 
    }; 
} 

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

Цитата из Crockford для быстрого пояснения о закрытии, но вы можете найти много related questions.

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

+1

... за исключением того, что вы можете создавать переменные, которые по существу [private by closures] (http://phrogz.net/js/Classes/OOPinJS.html). – Phrogz

+1

@Phrogz Вы можете это сделать, конечно, но вы не можете иметь действительную переменную, содержащую личное значение, в глобальной области. – Radu

+0

Исправить; Я комментировал только первое предложение вашего первоначального ответа. :) – Phrogz

Смежные вопросы