为了账号安全,请及时绑定邮箱和手机立即绑定

如何监听 js 中变量的变化?

/ 猿问

如何监听 js 中变量的变化?

我现在有这样一个需求,需要监控js的某个变量的改变,如果该变量发生变化,则触发一些事件,不能使用timeinterval之类的定时去监控的方法,不知道有比较好的解决方案么?

比如我定义了如下全局变量:

var a= { zhihu:0 };

需要做的是当config.jiankong值被其他js文件中的某些函数改变时,需要触发指定的事件!


查看完整描述

8 回答

?
慕田峪是谁我也不认识

别用变量就好了~弄个函数,里面声明一个变量,或者用一个全局变量,需要修改的时候得调用这个函数,这样你就能知道了

查看完整回答
2 反对 回复 2018-02-08
?
webwbqing4123118

如果是对象的话,你可以借鉴一下vue 的响应式思想。object.defineProperty定义对象的时候遍历对象属性,监听对象的 get  、set ,判断对象是否被更改。数组的话,你要监听能改变数组的很多方法,push、pop、shift、unshift等等,这个工程量是有点大的。

查看完整回答
2 反对 回复 2018-02-01
?
英明神武的牛

数组的话可以通过重定义JS系统函数来实现了,通过 Array.prototype.add = func(){  this.push() }  之类的方法  在fun中增加一个自定义的回调事件

查看完整回答
2 反对 回复 2018-02-01
?
林逸舟丶

不知道你接触过Vue.js没有,想来应该是没接触过。

es6新增了一些底层方法,支持观察到变量的变化,你可以百度一下

查看完整回答
2 反对 回复 2018-02-01
?
不要慕码人我要切诺基

1.使用 defineProperty 或 __define_setter__ 给写属性添加回调函数。对浏览器兼容性有要求

2.使用现成的库,比如 watch.js。不过在老版本浏览器下 watch.js 使用了定时器监控,此时回调是异步的,而在新版浏览器中回调是同步的,时序不一致

3.使用 MVVM 框架 avalon,此框架使用 vb script 实现了老版本 IE 的兼容,没有使用定时器,不过针对你的简单需求,略有点庞大

4.数组成员不能靠以上方法监听,目前我所知的只能间接监听一部分数组函数,实现方法就是函数替换,替换目标是那些会改变 this 数组的“非纯函数”,比如splice

查看完整回答
1 反对 回复 2018-02-09
?
拖鞋_

ES6好像有

查看完整回答
1 反对 回复 2018-02-01
?
远看寒山石径斜

用KnockoutJS可以较容易实现。Knockout的observable可以实现数据的双向绑定,用被监控的变量名.subscribe(function(){//变量改变后调用该函数})可以实现某个变量变化就调用这个function

查看完整回答
反对 回复 2018-02-09
?
LIANHK

原理是比较新值和旧值,当值真的发生改变时再去触发指定的事件;

如何判断值是否发生改变呢,可以参考下这篇:

https://blog.daraw.cn/2016/08/17/how-to-monitor-changes-of-js-variable/

查看完整回答
反对 回复 2018-02-01

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信