2

我有一个 javascript 对象,我通过 websocket 作为原始文本传递给客户端。这个原始文本(现在)在收到时直接传递到 eval 语句中。问题是,由于某种原因,Javascript 在将数据传递给事件处理程序之前一直在对其进行操作。我束手无策。

通过 websocket 传递的对象是:

var obj = {
    evaluate:function(str) {
        digit = parseInt(str,10);
        if(isNaN(digit)) {
            log.write("Invalid input: "+str);
        } else {
            log.write(this.spigot(digit));
        }
    },
    spigot:function(digit) {
        len = Math.floor(10*digit/3)+1;
        A = new Array(len);

        for(var i=0;i<len;i++) A[i]=2;
        var finalDigit = 0;
        var nines = 0;
        var predigit = 0;

        for(i=1;i<digit+1;i++) {
            q = 0;
            for(j=len;j>0;j--) {
                x = 10*A[j-1] + q*j;
                x = Math.floor(x)
                A[j-1] = x % ((2*j)-1);
                A[j-1] = Math.floor(A[j-1]);
                q = x / ((2*j) -1);
                q = Math.floor(q);
            }

            A[0] = Math.floor(q%10);
            q = Math.floor(q/10);

            if(q==9) {
                nines++;
            } else if (q==10) {
                finalDigit = predigit+1;
                for(j=0;j<nines;j++) {
                    finalDigit = 0;
                }
                predigit=0;
                nines=0;
            } else {
                finalDigit = predigit;
                predigit=q;
                for(j=0;j<nines;j++) {
                    finalDigit = 9;
                }
                nines=0;
            }
        }
        return finalDigit;
    }
}

客户端收到整个消息(我使用 Chrome 的开发人员工具和 Firebug 进行了检查)。但是,当我在以下事件处理程序中收到消息时:

function socketMessage(e) {
    log.write(e.data); //a log function I have written
}

e.data 包含:

obj = {
    evaluate:function(str) {
        digit = parseInt(str,10);
        if(isNaN(digit)) {
            log.write('Invalid input: '+str);
        } else {
            log.write(this.spigot(digit));
        }
    },
    spigot:function(digit) {
        len = Math.floor(10*digit/3)+1;
        A = new Array(len);

        for(var i=0;i<len;i++) A[i]=2;
        var finalDigit = 0;
        var nines = 0;
        var predigit = 0;

        for(i=1;i<digit+1;i++) {
            q = 0;
            for(j=len;j>0;j--) {
                x = 10*A[j-1] + q*j;
                x = Math.floor(x)
                A[j-1] = x %((MISSING)(2*j)-1);
                A[j-1] = Math.floor(A[j-1]);
                q = x / ((2*j) -1);
                q = Math.floor(q);
            }

            A[0] = Math.floor(q%)(MISSING);
            q = Math.floor(q/10);

            if(q==9) {
                nines++;
            } else if (q==10) {
                finalDigit = predigit+1;
                for(j=0;j<nines;j++) {
                    finalDigit = 0;
                }
                predigit=0;
                nines=0;
            } else {
                finalDigit = predigit;
                predigit=q;
                for(j=0;j<nines;j++) {
                    finalDigit = 9;
                }
                nines=0;
            }
        }
        return finalDigit;
    }
}

请注意代码是如何变化的。整个过程中添加了随机(MISSING)字符串,并且一些方程式已被截断。

为什么会这样?

编辑1:

玩了一段时间后,我注意到它发生在%符号之后,无论其位置如何......所以我的问题是,为什么%操作员在这里具有导致事件监听器屠杀我的代码内容的意义?

编辑2:

在传递给我的回调函数之前,它似乎%被解释为转义字符。我在%25通过套接字发送它之前尝试过使用,但无济于事。

4

1 回答 1

0

%字符被 Javascript 解释为转义字符。您看到添加的(MISSING)文本是 Javascript 告诉您转义字符后面没有两位转义码的方式。解决这个问题的最简单方法是定义一个mod(a,b)完成与模数相同的事情的函数。IE:

....},
mod:function(a,b) {
    return (a/b-Math.floor(a/b))*b;
}

然后当您需要使用模数运算符时,只需调用

Math.floor(this.mod(q,10));
于 2013-09-24T02:43:08.847 回答