Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.07.2017, 18:07
Новичок на форуме
Отправить личное сообщение для dexforint Посмотреть профиль Найти все сообщения от dexforint
 
Регистрация: 31.07.2017
Сообщений: 1

Проверка значения переменной при её изменении
Допустим у нас есть переменная x со значением 3 (var x = 3; ), и нам нужно сделать чтобы, когда её значение изменится на 5 (x = 5; ), выводилось сообщение (console.log("x == 5")) . Я пытался реализовать, но я встрял:
---------------------------------------------------------------------
var x = 3;
Object.defineProperty(window, "x", {
get : function(){
return this.x;
},
set : function(value){
this.x = value;
if (this.x == 5) {
console.log("x == 5");
}
}
});
x = 5;
----------------------------------------------------------------------
В итоге выводится ошибка. Как бы данную затею реализовать?
Ответить с цитированием
  #2 (permalink)  
Старый 31.07.2017, 18:44
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

var x = 3;
Object.defineProperty(window, "x", {
get : function(){
return this._x;
},
set : function(value){
this._x = value;
if (value == 5) {
console.log("x == 5");
}
}
});
x = 5;
Ответить с цитированием
  #3 (permalink)  
Старый 31.07.2017, 20:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

destus,
ваш вариант точно рабочий? у меня с var или let не работает.
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2017, 20:33
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

почему нельзя так сделать
var x = 3;
		{// это функция в которой что-то делается
			x = 5;
			xxx();
		}
		function xxx(){
			if(x == 5) console.log("x == 5");
		}
Ответить с цитированием
  #5 (permalink)  
Старый 01.08.2017, 06:54
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

рони,
А поподробней? Браузер / ошибка/ гифка?
Ответить с цитированием
  #6 (permalink)  
Старый 01.08.2017, 09:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

destus,
windows 10
Цитата:
TypeError: can't redefine non-configurable property "x"
-- Mozilla Firefox
Цитата:
Uncaught TypeError: Cannot redefine property: x
at Function.defineProperty (<anonymous>)
-- Google Chrome
создал страницу для теста
<!DOCTYPE html>

<html>
<head>

  <script>
var x = 3;
Object.defineProperty(window, "x", {
get : function(){
return this._x;
},
set : function(value){
this._x = value;
if (value == 5) {
console.log("x == 5");
}
}
});
x = 5;

  </script>
</head>

<body>


</body>
</html>

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

Последний раз редактировалось рони, 01.08.2017 в 09:08.
Ответить с цитированием
  #7 (permalink)  
Старый 01.08.2017, 12:03
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

destus, рони,
Выходит глобальные переменные в глобальном eval становятся configurable
var x = 3;
alert(delete x);

Последний раз редактировалось Rise, 01.08.2017 в 12:08.
Ответить с цитированием
  #8 (permalink)  
Старый 01.08.2017, 13:21
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Rise,
рони,
похоже на то...
Ответить с цитированием
  #9 (permalink)  
Старый 01.08.2017, 14:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Rise,
destus,
не понимаю чем var x = 3;(не рабочий вариант) отличается от x = 3; (рабочий)
так и так оба варианта глобальны, в данном случае, но второй работает, а первый нет?
Ответить с цитированием
  #10 (permalink)  
Старый 01.08.2017, 16:45
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

рони,
Всё дело в атрибуте configurable определяемом по наличию (declared) / отсутствию (undeclared) var:
Цитата:
Declared variables are a non-configurable property of their execution context (function or global). Undeclared variables are configurable (e.g. can be deleted). отсюда
Цитата:
The configurable attribute controls at the same time whether the property can be deleted from the object and whether its attributes (other than writable to false) can be changed. отсюда
Получается что (1) это (2):
// The 'x' is a non-configurable property of window
var x = 3; // (1)
Object.defineProperty(window, 'x', { value: 3, configurable: false, writable: true, enumerable: true }); // (2)

// The 'y' is a configurable property of window
y = 4; // (1)
Object.defineProperty(window, 'y', { value: 4, configurable: true, writable: true, enumerable: true }); // (2)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при клике использовать предыдущее значения переменной внутри функции akagloomy jQuery 7 29.01.2015 00:37
При изменении значения select'a оно меняется, затем сбрасывается. upvasil jQuery 0 16.03.2013 23:47
Проверка имени пользователя при вводе st1512 AJAX и COMET 1 07.09.2009 09:58
Проверка статуса checkbox при xmlhttprequest vvsh AJAX и COMET 3 06.08.2009 15:51
выполнение ф-ии при изменении состояния radio MaxB Events/DOM/Window 5 24.06.2009 14:24