Подтвердить что ты не робот

Javascript: конечные/неизменные глобальные переменные?

Я думаю, что знаю ответ, но... есть ли способ предотвратить изменение глобальной переменной более поздним исполнением <script>? Я знаю, что глобальные переменные в первую очередь плохи, но когда это необходимо, есть ли способ сделать его "окончательным" или "неизменным"? Приветствия/творческие решения приветствуются. Благодаря

4b9b3361

Ответ 1

const ключевое слово?

Ответ 2

Вы можете использовать метод закрытия, MYGLOBALS - это объект, который имеет функцию getValue против ассоциативного массива "globals", который выходит за рамки для всего, кроме экземпляра MYGLOBALS.

var MYGLOBALS = function() {
    var globals = {
        foo : "bar",
        batz : "blah"       
    }
    return { getValue : function(s) {
            return globals[s];
        }
    }
}();
alert(MYGLOBALS.getValue("foo"));  // returns "bar"
alert(MYGLOBALS.getValue("notthere")); // returns undefined
MYGLOBALS.globals["batz"] = 'hardeehar'; // this will throw an exception as it should

Ответ 3

Я знаю, что этот вопрос старый, но вы можете использовать Object.freeze(yourGlobalObjectHere); Я просто написал сообщение в блоге об этом здесь.

Ответ 4

да const является константой для постоянных или конечных на некоторых языках. google "переменная javascript const" или постоянная, чтобы удвоить, я даже сам ее протестировал, поэтому

const yourVar = 'your value';

вот что вы ищете.

Ответ 5

Это будет гораздо более чистый подход

   var CONSTANTS = function() {
        var constants = { } ; //Initialize Global Space Here
        return {
            defineConstant: function(name,value)
            {
                if(constants[name])
                {
                   throw "Redeclaration of constant Not Allowed";
                }
            },
            getValue(name)
            {
               return constants[name];
            }
        } ;
    }() ;
    CONSTANTS.defineConstant('FOO','bar') ;
    console.log(CONSTANTS.getValue('FOO')) ; //Returns bar
    CONSTANTS.defineConstant('FOO','xyz') ; // throws exception as constant already defined
    CONSTANTS.getValue('XYZ') ; //returns undefined

код >

Ответ 6

Выберите имя переменной, которое вряд ли будет перезаписано случайно, и доверять программисту, чтобы он не делал глупых вещей. JavaScript не Java, поэтому не притворяйтесь, что это было.

Кроме того, если вы действительно хотите сделать это, это пространство имен, используйте самопроизвольный литерал функции:

var myLibName = (function() {
    var aPrivateVar;

    function aPrivateFunction() {}

    function accessorForPrivateVar() {
        return aPrivateVar;
    }

    // public interface:
    return {
        getPrivateVar : accessorForPrivateVar
    }
})();

Ответ 7

попробуйте следующее:

const whatEver = 'Hello World!!!';

function foo(value){
 whatEver = value;
}

тогда вы бы назвали его так...

<div onclick="foo('New Value');">Change Me First</div>
<div onclick="alert(whatEver);">Then click me After: Should Be alert "Hello World!!!"</div>

Ответ 8

как насчет этого кода http://ejohn.org/ @http://ejohn.org/blog/ecmascript-5-objects-and-properties/

Похоже, что это действительно работает... Я запускаю небольшое "тестирование" и замораживаю переменные и атрибуты.

Замораживание объекта - это конечная форма блокировки. Как только объект был заморожен, он не может быть разморожен - и он не может быть манера. Это лучший способ убедиться, что ваши объекты останутся точно так же, как вы их оставили, на неопределенный срок.

Object.freeze = function( obj ) {
  var props = Object.getOwnPropertyNames( obj );

  for ( var i = 0; i < props.length; i++ ) {
    var desc = Object.getOwnPropertyDescriptor( obj, props[i] );

    if ( "value" in desc ) {
      desc.writable = false;
    }

    desc.configurable = false;
    Object.defineProperty( obj, props[i], desc );
  }

  return Object.preventExtensions( obj );
};

Маленький пример

var config = (function (__name) {
    name: __name
    var _local = {
        Server: "SomeText",
        ServerDate: "SomeServerDate",
        JSDate : Util.today(),
        User : {
            user: "1stUser",
            name: "",
            email: ""
        },        
    }

    /*Private Methods*/
    function freezing(__array) {
        $.each(__array, function (_index, _item) {
            Object.freeze(_item);
        });
    }

    /*Public Methods*/
    var $r = {};

    $r.info = function () {
        return _local;
    }

    freezing([
        _local,
        _local.User
    ]);


    _local.User.user = "newUser"; //Trying to assing new value

    //Remain with the same value as first declaration
    console.log(_local.User.user); //--> "1stUser"           
    return $r;
})("config");

Ответ 9

Соглашения и хорошая документация.

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

Возможно, создав "пространство имен", например __GLOBALNAMESPACE (злобное имя, я знаю), а затем добавив в него свои переменные (например, __GLOBALNAMESPACE.my_var) и создав метод, подобный этому, чтобы получить их:

getVariable(string name){
  return __GLOBALNAMESPACE[name]
}

Только мои 2 цента.

Ответ 10

Javascript объектно ориентирован, вместо того, чтобы делать переменную $public static, подумайте о том, чтобы сделать ее приватной, а затем надлежащим образом предоставив метод-получатель, но не установив ее.

например.

private var myGlobal : myType;
function GetMyGlobal() : myType
{
return myGlobal;
}

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

Ответ 11

Object.defineProperty(window, 'CONSTANT_NAME', {value: CONSTANT_VALUE});

// usage
console.log(CONSTANT_NAME);

Object.defineProperty() создает свойство со следующими атрибутами по умолчанию:

  • configurable true, если и только если тип этого дескриптора свойства может быть изменен и если свойство может быть удалено из соответствующего объекта. По умолчанию false.

  • enumerable true тогда и только тогда, когда это свойство появляется во время перечисления свойств соответствующего объекта. По умолчанию false.

  • writable true, если и только если значение, связанное с свойством, может быть изменено с помощью оператора присваивания. По умолчанию false.

если "константа" - это объект, который вы, возможно, захотите сделать его неизменным, заморозив его. obj = Object.freeze(obj). имейте в виду, что объекты child-property не будут автоматически заморожены.

Ответ 12

Вместо того, чтобы объявлять все такие переменные в глобальной области видимости, вы можете иметь один глобальный объект, обертывающий эти переменные. Используя Object.defineProperty() и/или Object.defineProperties() с флагом writable, установленным на false, вы можете иметь неизменяемую переменную.

var myObj = {};

Object.defineProperty(myObj, 'myVar', {
    value: someValue,
    writable: false
});

Или вы можете просто использовать ключевое слово const

const MY_VAR = 10;

Ответ 13

Если вы можете использовать typescript, вы можете пометить свойства как readonly

Ответ 14

Возможно, вы захотите попробовать этот jquery plugin. Это предотвращает создание глобальных объектов в javascript:)

пример кода

Сохранять данные

// 'val' can be a string, integer, hash table, array, object
$.secret( 'in', 'secretName', val );

// or a function
$.secret( 'in', 'secretName', function( arg1, arg2, arg3 ){
  // do something here
});

Использовать данные; вы даже можете использовать его в разных файлах.

var lang = $.secret( 'out', 'lang' );

Вызвать функцию

$.secret( 'call', 'secretName', [ arg1, arg2, arg3 ]);
// or
$.secret( 'call', 'secretName', arg );

Очистить данные

$.secret( 'clear', 'lang' );

исходный код находится на github

Ответ 15

Не то, чтобы я знал. Самое лучшее, о чем я могу думать, - это сохранить значение для объекта, который вряд ли будет изменен.

например.

navigator.pleaseDontChangeThis = 25;

Его все равно можно изменить, но большинству обычных JS не нужно будет устанавливать/изменять любые значения в объекте навигатора. Я лично использую это для хранения уникального сгенерированного идентификатора.; -)