我有一个变量,它总是一个整数,不时增加和/或减少值,从1-5开始。 我想知道我是否可以以任何方式检测它是否上升或下降,例如:
变量当前为3,如果变为4,则运行一个函数,但如果变量减少到2,则运行另一个函数。
能做到吗?
答案 0 :(得分:7)
以下四种方法将取决于浏览器兼容性的支持,这篇文章 花了我一段时间,但它也教会了我 ___
是的,我希望我列出大多数方法,如果你知道更多,你可以发一个答案。 然而,您可以在评论中发布您的方法,这样我就可以将其添加到此答案中。干杯!
1 使用 Object.observe:
Object.observe(i, function(b){ b.object[change.name] > b.type ? console.log('decreased') : console.log('increased'); });
Object.observe
如果您想在Chrome 33中启用它,
访问chrome:// flags /
启用启用实验性JavaScript
2 使用 setInterval:
var i = 4;
var a = i;
setInterval(function()
{
if(i != a) a > i ? console.log('decreased') : console.log('increased');
}, 1000);
i = 10;
应该在一秒内记录'增加'。
3 使用 Object.watch:
var i = {i:5};
i.watch("i", function (id, oldval, newval) {
newval > oldval ? console.log('decreased') : console.log('increased');
return newval;
});
Object.watch
要支持更多浏览器,请添加以下脚本:
if (!Object.prototype.watch) {
Object.defineProperty(Object.prototype, "watch", {
enumerable: false
, configurable: true
, writable: false
, value: function (prop, handler) {
var
oldval = this[prop]
, newval = oldval
, getter = function () {
return newval;
}
, setter = function (val) {
oldval = newval;
return newval = handler.call(this, prop, oldval, val);
}
;
if (delete this[prop]) { // can't watch constants
Object.defineProperty(this, prop, {
get: getter
, set: setter
, enumerable: true
, configurable: true
});
}
}
});
}
// object.unwatch
if (!Object.prototype.unwatch) {
Object.defineProperty(Object.prototype, "unwatch", {
enumerable: false
, configurable: true
, writable: false
, value: function (prop) {
var val = this[prop];
delete this[prop]; // remove accessors
this[prop] = val;
}
});
}
从https://gist.github.com/eligrey/384583
获得4. 使用自定义值集功能:
i = 4;
function setValue(obj, val)
{
val < obj ? console.log('decrease') : console.log('increase');
obj = val;
}
setValue(i, 10);
应记录'增加'。
其中大多数都要求变量为对象,所以我宁愿随时间检测,如方法 2中所见。
答案 1 :(得分:1)
当然,但你必须定期检查。既然你没有提供代码,我也不会。 : - )
正如评论中所提到的,有更好的方法,例如在一开始就对变量的值进行任何更改时运行功能(或作为回调)。
答案 2 :(得分:0)
我不会检测变量是否发生变化,而是使用函数来修改变量。这样,函数可以检查值是否已更改,如果有,则调用新函数。类似的东西:
var triggerVariable;
function changeVariable(newVal){
if(triggerVariable !== newVal){
triggerVariable = newVal;
callFunction();
}
}
function callFunction(){
alert('variable changed!');
}
changeVariable(10);
答案 3 :(得分:0)
应该很好地支持Object.observe。您可以随意跟踪您的状态(可能在某种关闭中)。
http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe
答案 4 :(得分:0)
您还可以为此特殊变量创建一个类,并使用回调为数学函数编写自定义函数。这是添加功能
的示例function specVal (value)
{
this.onChange = null;
this.value = value;
this.val = function()
{
return this.value;
};
this.add = function(i)
{
this.value += i;
if (this.onChange != null)
this.onChange(this);
return this;
}
}
function somethingChanged(val)
{
alert('changed: ' + val.val());
}
myValue = new specVal(10);
myValue.onChange = somethingChanged;
myValue.add(5);
myValue.add(4);
答案 5 :(得分:0)
我会按照建议使用 MV *框架(淘汰赛是一个轻量级选项) 或者永远不要直接改变变量。 使用setter函数更改其值并每次触发自定义事件。 JQuery 示例:
Function setMyVar(val){
if(_myVar !== val){
_myVar = val;
$('#anyelement').triggerHandler('myvarupdated', [myVar]);
}
}
答案 6 :(得分:0)
与之前的答案非常相似。
- 设置第二个变量等于第一个
- 定期(或在某些事件中)检查第二个与第一个
- 做出相应的回应
醇>
但以不同的方式组织它。 并确保将最后一个变量留在函数之外。此外,在 if 条件语句的末尾更新正在检查更改的值的值。
希望它有所帮助!
var lastValue = 0;
$(function () {
if (lastValue > originalValue){
console.log ("Increasing");
}
else if (lastValue < originalValue) {
console.log("Decreasing");
}
lastValue = originalValue;
});
选中此JSFiddle
答案 7 :(得分:0)
let prev;
const change = (i) => {
if (prev === undefined) prev = i;
const next = i;
if (prev < next) console.log("increase");
if (prev > next) console.log("decrease");
prev = next;
};