变量冲突处理
程序员文章站
2022-03-14 10:33:43
最近做了一阶段的ajax开发,有一些心得体会。日后会慢慢写出来,也请ajaxer多多指教~ 刚开始写ajax代码的时候,直接参照的是aja...
最近做了一阶段的ajax开发,有一些心得体会。日后会慢慢写出来,也请ajaxer多多指教~ 刚开始写ajax代码的时候,直接参照的是ajax基础教程一书中的代码(该书真的很不错,是ajax入门的经典教材,是图灵出版社的。计算机方面的书籍,我最信任的就是o'r和图灵的)。
该书的创建xmlhttprequest对象的代码如下:
var xmlhttp;
function createxmlhttprequest() { if (window.activexobject) { xmlhttp = new activexobject("microsoft.xmlhttp"); } else if (window.xmlhttprequest) { xmlhttp = new xmlhttprequest(); }}
在一般情况下,该代码的使用不会带来任何问题。
如:
function test1(){ createxmlhttprequest(); xmlhttp.onreadystatechange = handlestatechange1; url = "test.php?ts=" + new date().gettime(); xmlhttp.open("get", url, true); xmlhttp.send(null);}
function test2(){ createxmlhttprequest(); xmlhttp.onreadystatechange = handlestatechange2; url = "test.php?ts=" + new date().gettime(); xmlhttp.open("get", url, true); xmlhttp.send(null);}
function handlestatechange1() { ......
}
function handlestatechange2() { ......
}
..........
在页面的不同地方调用test1,test2函数都能正常工作。即不同时刻调用的话,就不会产生问题。
但是假如你需要在同一时刻同时调用这两个函数,则会发现只有其中一个可以正常运行。
比如,我在加载页面的时候运行如下函数:
function init(){ test1(); test2();}
此时,则test1,test2只有一个函数会正常执行。
分析下原因,是由于javascript的语言特性导致。一般情况下,javascript的变量,函数等等,都是公用的,其他对象都能访问(可读可写)。这就是问题的所在。在同一时刻,调用test1和test2就会出现“变量xmlhttp”的冲突。
解决方法:
1 最简单的方法,不要在同一时刻调用,如init函数可以改为:
function init(){ test1(); settimeout("test2()",500);}
但该方法属于投机,并未真正解决问题。
2 修改“xmlhttprequest创建函数”,改为一实例化函数。
function createxmlhttprequest() { if (window.activexobject) { var xmlhttpobj = new activexobject("microsoft.xmlhttp"); } else if (window.xmlhttprequest) { var xmlhttpobj = new xmlhttprequest(); } return xmlhttpobj;}
实例化时相应的改为:
function test1(){ xmlhttp_1 = createxmlhttprequest();
xmlhttp_1.onreadystatechange = handlestatechange1; url_1 = "test.php?ts=" + new date().gettime(); xmlhttp_1.open("get", url, true); xmlhttp_1.send(null);}
function test2(){ xmlhttp_2 = createxmlhttprequest();
xmlhttp_2.onreadystatechange = handlestatechange1; url_2 = "test.php?ts=" + new date().gettime(); xmlhttp_2.open("get", url, true); xmlhttp_2.send(null);}
这样子处理的话,即使在同一时刻调用test1,test2函数,也不会产生问题了,实现了真正的“同步”。
#######################################################
通过该方法,可以引申出javascript中对象的“私有属性”的创建方法:
1 私有属性可以在构造函数中使用 var 关键字定义。
2 私有属性只能由特权函数公用访问。(特权函数就是在构造函数中使用this关键字定义的函数)。外部客户可以访问特权函数,而且特权函数可以访问对象的私有属性。
比如下面这个vehicle类,则wheelcount和curbweightinpounds就是私有属性,只能通过特权函数访问/设置了:
function vehicle() { var wheelcount = 4; var curbweightinpounds = 4000;
this.getwheelcount = function() { return wheelcount; }
this.setwheelcount = function(count) { wheelcount = count; }
this.getcurbweightinpounds = function() { return curbweightinpounds; }
this.setcurbweightinpounds = function(weight) { curbweightinpounds = weight; }
}
该书的创建xmlhttprequest对象的代码如下:
var xmlhttp;
function createxmlhttprequest() { if (window.activexobject) { xmlhttp = new activexobject("microsoft.xmlhttp"); } else if (window.xmlhttprequest) { xmlhttp = new xmlhttprequest(); }}
在一般情况下,该代码的使用不会带来任何问题。
如:
function test1(){ createxmlhttprequest(); xmlhttp.onreadystatechange = handlestatechange1; url = "test.php?ts=" + new date().gettime(); xmlhttp.open("get", url, true); xmlhttp.send(null);}
function test2(){ createxmlhttprequest(); xmlhttp.onreadystatechange = handlestatechange2; url = "test.php?ts=" + new date().gettime(); xmlhttp.open("get", url, true); xmlhttp.send(null);}
function handlestatechange1() { ......
}
function handlestatechange2() { ......
}
..........
在页面的不同地方调用test1,test2函数都能正常工作。即不同时刻调用的话,就不会产生问题。
但是假如你需要在同一时刻同时调用这两个函数,则会发现只有其中一个可以正常运行。
比如,我在加载页面的时候运行如下函数:
function init(){ test1(); test2();}
此时,则test1,test2只有一个函数会正常执行。
分析下原因,是由于javascript的语言特性导致。一般情况下,javascript的变量,函数等等,都是公用的,其他对象都能访问(可读可写)。这就是问题的所在。在同一时刻,调用test1和test2就会出现“变量xmlhttp”的冲突。
解决方法:
1 最简单的方法,不要在同一时刻调用,如init函数可以改为:
function init(){ test1(); settimeout("test2()",500);}
但该方法属于投机,并未真正解决问题。
2 修改“xmlhttprequest创建函数”,改为一实例化函数。
function createxmlhttprequest() { if (window.activexobject) { var xmlhttpobj = new activexobject("microsoft.xmlhttp"); } else if (window.xmlhttprequest) { var xmlhttpobj = new xmlhttprequest(); } return xmlhttpobj;}
实例化时相应的改为:
function test1(){ xmlhttp_1 = createxmlhttprequest();
xmlhttp_1.onreadystatechange = handlestatechange1; url_1 = "test.php?ts=" + new date().gettime(); xmlhttp_1.open("get", url, true); xmlhttp_1.send(null);}
function test2(){ xmlhttp_2 = createxmlhttprequest();
xmlhttp_2.onreadystatechange = handlestatechange1; url_2 = "test.php?ts=" + new date().gettime(); xmlhttp_2.open("get", url, true); xmlhttp_2.send(null);}
这样子处理的话,即使在同一时刻调用test1,test2函数,也不会产生问题了,实现了真正的“同步”。
#######################################################
通过该方法,可以引申出javascript中对象的“私有属性”的创建方法:
1 私有属性可以在构造函数中使用 var 关键字定义。
2 私有属性只能由特权函数公用访问。(特权函数就是在构造函数中使用this关键字定义的函数)。外部客户可以访问特权函数,而且特权函数可以访问对象的私有属性。
比如下面这个vehicle类,则wheelcount和curbweightinpounds就是私有属性,只能通过特权函数访问/设置了:
function vehicle() { var wheelcount = 4; var curbweightinpounds = 4000;
this.getwheelcount = function() { return wheelcount; }
this.setwheelcount = function(count) { wheelcount = count; }
this.getcurbweightinpounds = function() { return curbweightinpounds; }
this.setcurbweightinpounds = function(weight) { curbweightinpounds = weight; }
}
上一篇: Ajax Hacking
下一篇: ajax实现标签导航