31.07.2017, 18:07
|
Новичок на форуме
|
|
Регистрация: 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;
----------------------------------------------------------------------
В итоге выводится ошибка. Как бы данную затею реализовать?
|
|
31.07.2017, 18:44
|
|
Профессор
|
|
Регистрация: 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;
|
|
31.07.2017, 20:19
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,072
|
|
destus,
ваш вариант точно рабочий? у меня с var или let не работает.
|
|
31.07.2017, 20:33
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
почему нельзя так сделать
var x = 3;
{// это функция в которой что-то делается
x = 5;
xxx();
}
function xxx(){
if(x == 5) console.log("x == 5");
}
|
|
01.08.2017, 06:54
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
рони,
А поподробней? Браузер / ошибка/ гифка?
|
|
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.
|
|
01.08.2017, 12:03
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
destus, рони,
Выходит глобальные переменные в глобальном eval становятся configurable
var x = 3;
alert(delete x);
Последний раз редактировалось Rise, 01.08.2017 в 12:08.
|
|
01.08.2017, 13:21
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Rise,
рони,
похоже на то...
|
|
01.08.2017, 14:56
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,072
|
|
Rise,
destus,
не понимаю чем var x = 3;(не рабочий вариант) отличается от x = 3; (рабочий)
так и так оба варианта глобальны, в данном случае, но второй работает, а первый нет?
|
|
01.08.2017, 16:45
|
Профессор
|
|
Регистрация: 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)
|
|
|
|