Я думаю, что знаю ответ, но... есть ли способ предотвратить изменение глобальной переменной более поздним исполнением <script>
? Я знаю, что глобальные переменные в первую очередь плохи, но когда это необходимо, есть ли способ сделать его "окончательным" или "неизменным"? Приветствия/творческие решения приветствуются. Благодаря
Javascript: конечные/неизменные глобальные переменные?
Ответ 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 не нужно будет устанавливать/изменять любые значения в объекте навигатора. Я лично использую это для хранения уникального сгенерированного идентификатора.; -)