我有一个 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)
字符串,并且几个方程已被 chop 。
为什么会发生这种情况?
编辑1:
玩了一段时间后,我注意到它发生在 %
符号之后,无论其位置如何......所以我的问题是,为什么 %
具有重要意义操作符在这里导致事件监听器屠杀我的代码内容?
编辑2:
在传递给我的回调函数之前,%
似乎被解释为转义字符。在通过套接字发送它之前,我尝试使用 %25
但无济于事。
最佳答案
%
字符被 Javascript 解释为转义字符。您看到添加的 (MISSING)
文本是 Javascript 告诉您转义字符后面没有两位数转义代码的方式。解决这个问题的最简单方法是定义一个函数 mod(a,b)
来完成与模数相同的事情。即:
....},
mod:function(a,b) {
return (a/b-Math.floor(a/b))*b;
}
然后当你需要使用模运算符时,只需调用
Math.floor(this.mod(q,10));
关于Javascript Websocket 将代码传递给 Eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971764/