2013-03-17 61 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(...