2013-09-24 49 views
1

我有一個javascript對象,我通過websocket作爲原始文本傳遞給客戶端。此原始文本(現在)在收到時直接傳遞給eval語句。問題在於,由於某種原因,Javascript在將數據傳遞給事件處理程序之前一直處理數據。我很有智慧。JavaScript Websocket通過代碼來評估

正在被跨越的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在通過套接字發送它之前,但無濟於事。

回答

0

%字符被Javascript解釋爲轉義字符。您看到的(MISSING)文本添加了Javascript的方式,告訴您轉義字符後面沒有兩位數的轉義碼。解決這個問題最簡單的方法是定義一個函數mod(a,b),它完成與模數相同的事情。即:

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

然後,當你需要使用模運算符,只需撥打

Math.floor(this.mod(q,10));