0

我刚刚在 HN 上看到了这个矩阵,不到 600 个字节

这是完整的来源:

<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(左侧)分配吗?

4

2 回答 2

6

你是对的,标识符不能以数字开头。如果您仔细观察, 将9替换为;q.getContext('2d').fill

p循环分解为设置变量并创建一个包含 256秒的数组1

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
})
于 2013-03-17T13:20:00.397 回答
1

它不以数字开头。它只是一个字符串,被拆分:

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

于 2013-03-17T13:20:29.380 回答