12306刷新间隔引发的抢票问题 12306抢票全局变量模式javascript
程序员文章站
2022-04-09 17:50:21
...
进入12306订票页面,默认的刷新间隔时间是5s(5000ms),页面虽没有提供修改间隔的功能,但通过运行:
可以将间隔时间修改为任意自己想要的值(如:1s),从而简单实现刷票。原因在于autoSearchTime是全局变量,通过控制台便可以任意的修改(甚至可以通过脚本实现刷新的调用)。如此,神马抢票软件、抢票浏览器都是浮云,何必冒着泄露隐私给第三方的风险去安装不必要的软件呢?
其实,JS完全可以避免使用全局变量,虽然没有提供private关键字,但已有不少成熟的模式实现变量的私有性:
1、构造函数方式:
name便是私有变量,无法通过toy.name访问。
2、对象私有性:
即使用闭包的方式访问局部变量,该方式同时也是“模块模式”的基础框架。
3、构造函数方式改进(使用原型):
该方式避免了每次调用构造函数时重新创建私有成员,实现多个实例之间的数据共享。
此外,更为合理的方式是采用模块模式,具体介绍见《JavaScript模式》P99~P103
注,以上例子出自该书P94~P99。
autoSearchTime=1000
可以将间隔时间修改为任意自己想要的值(如:1s),从而简单实现刷票。原因在于autoSearchTime是全局变量,通过控制台便可以任意的修改(甚至可以通过脚本实现刷新的调用)。如此,神马抢票软件、抢票浏览器都是浮云,何必冒着泄露隐私给第三方的风险去安装不必要的软件呢?
其实,JS完全可以避免使用全局变量,虽然没有提供private关键字,但已有不少成熟的模式实现变量的私有性:
1、构造函数方式:
function Gadget () { var name = 'iPod'; this.getName = function () { return name; } } var toy = new Gadget();
name便是私有变量,无法通过toy.name访问。
2、对象私有性:
var myobj = (function () { //私有成员 var name = 'my, oh my'; return { getName: function () { return name; } }; }()); myobj.getName();
即使用闭包的方式访问局部变量,该方式同时也是“模块模式”的基础框架。
3、构造函数方式改进(使用原型):
function Gadget () { var name = 'iPod'; this.getName = function () { return name; } } Gadget.prototype = (function () { var browser = 'Mobile Webkit'; return { getBrowser: { return browser; } }; }()); var toy = new Gadget(); console.log(toy.getName()); console.log(toy.getBrowser());
该方式避免了每次调用构造函数时重新创建私有成员,实现多个实例之间的数据共享。
此外,更为合理的方式是采用模块模式,具体介绍见《JavaScript模式》P99~P103
注,以上例子出自该书P94~P99。