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,135

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,135

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
Сообщений: 456

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,135

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

рони,
Когда объявляем через var, создается свойство объекта window, с десриптором {..., configurable: false, ...}
<script>
var x = 3;
const descriptor = Object.getOwnPropertyDescriptor(window, 'x');
alert(descriptor.configurable);
</script>

, а если без var, то с true
<script>
x = 3;
const descriptor = Object.getOwnPropertyDescriptor(window, 'x');
alert(descriptor.configurable);
</script>

И именно поэтому генерируется ошибка в первом случае, когда мы пытаемся переопределить дескриптор этого свойства (добавляя геттер / сеттер).

Можно было бы определить переменную через var, получить дескриптор, добавить геттер / сеттер, и удалить свойство из объекта window, но т.к. ссылка на переменную создается в VariableEnvironment, то delete window.x всегда будет возвращать false.

Rise,
Цитата:
Выходит глобальные переменные в глобальном eval становятся configurable
Нашел это в спецификации
2. If code is eval code, then let configurableBindings be true else let configurableBindings be false.
...
[[Configurable]]: configurableBindings
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при клике использовать предыдущее значения переменной внутри функции 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