Проверка значения переменной при её изменении
Допустим у нас есть переменная 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; ---------------------------------------------------------------------- В итоге выводится ошибка. Как бы данную затею реализовать? |
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; |
destus,
ваш вариант точно рабочий? у меня с var или let не работает. |
почему нельзя так сделать
var x = 3; {// это функция в которой что-то делается x = 5; xxx(); } function xxx(){ if(x == 5) console.log("x == 5"); } |
рони,
А поподробней? Браузер / ошибка/ гифка? |
destus,
windows 10 Цитата:
Цитата:
создал страницу для теста <!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, на форуме, сегодня их нет, когда запускаешь код. |
destus, рони,
Выходит глобальные переменные в глобальном eval становятся configurable :) var x = 3; alert(delete x); |
Rise,
рони, похоже на то... |
Rise,
destus, не понимаю чем var x = 3;(не рабочий вариант) отличается от x = 3; (рабочий) так и так оба варианта глобальны, в данном случае, но второй работает, а первый нет? |
рони,
Когда объявляем через 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, Цитата:
2. If code is eval code, then let configurableBindings be true else let configurableBindings be false. ... [[Configurable]]: configurableBindings |
Часовой пояс GMT +3, время: 19:13. |