2013-03-17 87 views
0

我剛纔看到this matrix on HN in less than 600 bytes矩陣有無效字符

下面是完整的源:

<body style=margin:0 onload="for(s=window.screen,w=q.width=s.width, 
    h=q.height=s.height,m=Math.random,p=[],i=0;i<256;p[i++]=1); 
    setInterval('9Style=\'rgba(0,0,0,.05)\'9Rect(0,0,w,h)9Style=\'#0F0\'; 
    p.map(function(v,i){9Text(String.fromCharCode(3e4+m()*33),i*10,v); 
    p[i]=v>758+m()*1e4?0:v+10})'.split(9).join(';q.getContext(\'2d\').fill'),33)"> 
    <canvas id=q> 

我的問題是如何對一個變量以數字開頭的分配:setInterval('9Style=\'rgba(0,0,0,.05...)我以爲JS變量」從一個數字開始。 這不應該是一個無效的lhs(左側)任務嗎?

回答

6

你說得對,標識符不能以數字開頭。如果仔細觀察,9將被替換爲;q.getContext('2d').fill

在設置變量和創建包含256 1秒的陣列p分解循環:

s = window.screen, 
w = q.width = s.width, 
h = q.height = s.height, 
m = Math.random, 
p = []; 
for (i = 0; i < 256; p[i++] = 1); 

餘項:

setInterval(
    '9Style=\'rgba(0,0,0,.05)\'9Rect(0,0,w,h)9Style=\'#0F0\';p.map(function(v,i){9Text(String.fromCharCode(3e4+m()*33),i*10,v);p[i]=v>758+m()*1e4?0:v+10})' 
    .split(9).join(';q.getContext(\'2d\').fill') 
, 33) 

這變爲:

setInterval(";q.getContext('2d').fillStyle='rgba(0,0,0,.05)';q.getContext('2d').fillRect(0,0,w,h);q.getContext('2d').fillStyle='#0F0';p.map(function(v,i){;q.getContext('2d').fillText(String.fromCharCode(3e4+m()*33),i*10,v);p[i]=v>758+m()*1e4?0:v+10})", 33); 

把這個代碼在http://jsbeautifier.org/給出:

; 
q.getContext('2d').fillStyle = 'rgba(0,0,0,.05)'; 
q.getContext('2d').fillRect(0, 0, w, h); 
q.getContext('2d').fillStyle = '#0F0'; 
p.map(function (v, i) {; 
    q.getContext('2d').fillText(String.fromCharCode(3e4 + m() * 33), i * 10, v); 
    p[i] = v > 758 + m() * 1e4 ? 0 : v + 10 
}) 
1

它不以數字開頭。這只是一個字符串,即拆分:

'9Style ....'.split(9).join(...