局部变量与全局变量

昨天调程序碰到一个问题:Microsoft JScript runtime error: ‘__pendingCallbacks[…].async’ is null or not an object

google后得到:

http://blog.csdn.net/fanfengchimo/archive/2007/07/20/1700402.aspx

http://www.cnblogs.com/xioxu/archive/2006/11/17/563202.html

原来是微软的代码里这一段i=0使用的是global的。

function WebForm_CallbackComplete() {
    for (i = 0; i < __pendingCallbacks.length; i++) {
        callbackObject = __pendingCallbacks[i];
        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
            WebForm_ExecuteCallback(callbackObject);
            if (!__pendingCallbacks[i].async) {

其实由于js是弱类型语言,大家都习惯于直接上来就用一个变量,而不是用var声明。缺点来了吧:即使是我不用变量i,如果在callback回来的处理函数再去callback,也会出现问题。WebForm_ExecuteCallback(callbackObject);
就有可能改变global i的值。

所以这还是一个潜在的bug.幸好对我来说,并没有callback调用callback,只需要用i的时候加上var声明就可以解决。

 

发表回复