Bagaimana cara kerja JavaScript berikut?
Saya mengerti bahwa itu adalah kode yang diperkecil. Saya telah mencoba sedikit menghilangkan obfuscasinya, tetapi saya tidak bisa mendapatkan konsep yang jelas tentang bagaimana efek ini mencapai efek ini. Saya dapat melihat bahwa itu menggunakan String untuk iterasi dari beberapa jenis, penggunaan objek Tanggal, manipulasi string aneh, fungsi Matematika, lalu kode mencetak dirinya sendiri.
Bagaimana efek yang sama dapat ditulis ulang dengan contoh yang minimal?
eval(z='p="<"+"pre>"/* ,.oq#+ ,._, */;for(y in n="zw24l6k\
4e3t4jnt4qj24xh2 x/* =<,m#F^ A W###q. */42kty24wrt413n243n\
9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\
r24".split(4)){/* dP cpq#q##########b, */for(a in t=pars\
eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\
(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]>i;i+=.05)wi\
th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0>cos(o=\
new Date/1e3/* .Q#########Md#.###OP A@ , */+x/PI)&&(e[~\
~(32*sin(o)*/* , (W#####Xx######.P^ T % */sin(.5+y/7))\
+60] =-~ r);/* #y `^TqW####P###BP */for(x=0;122>\
x;)p+=" *#"/* b. OQ####x#K */[e[x++]+e[x++\
]]||(S=("eval"/* l `X#####D , */+"(z=\'"+z.spl\
it(B = "\\\\")./* G####B" # */join(B+B).split\
(Q="\'").join(B+Q/* VQBP` */)+Q+")//m1k")[x/2\
+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&&"#\
03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)')//
javascript
Alexander
sumber
sumber
Jawaban:
Kata Pengantar : Saya mempercantik dan memberi anotasi kode secara ekstensif di http://jsfiddle.net/WZXYr/2/
Pertimbangkan lapisan terluar:
Sebuah string kode disimpan dalam variabel
z
. Operator penugasan mengembalikan nilai yang ditetapkan, sehingga string kode juga dilewatkan sebagai argumen keeval
.String kode
z
dijalankan di dalameval
. Kode tersebut sangat tumpul, bahkan ketika dibersihkan, tetapi tampaknya:4
.e
,x
dany
untuk terus negara peta. Status peta, sebagian, merupakan fungsi detik saat ini di jam dinding (new Date / 1e3
).p
p += " *#"[index]
untuk memutuskan apakah akan menggunakan spasi, asterisk, atau tanda pagar, di manaindex
sebenarnyae[x++] + e[x++]
(seperti yang dikatakan di atas,e
danx
bertanggung jawab atas keadaan peta)" *#"
, ada kode fallback yang mengisi keluaranp
dengan karakter dariz
. Karakter dalam diisi dengan karakter animasi, sedangkan karakter luar ditarik dariz
.Di akhir kode, ada panggilan ke
setTimeout(z)
, yang mengevaluasi string kode secara asinkronz
. Permintaan berulang iniz
memungkinkan kode untuk mengulang.Contoh sederhana:
Ini adalah versi yang sangat sederhana ( http://jsfiddle.net/5QXn8/ ):
The
for
Loop menambahkan setiap karakter untuk output stringp
(string adalah 172 karakter):Kondisi bagian dalam memutuskan apakah kita menggunakan karakter antara posisi 62 hingga 67, yang merupakan karakter animasi:
Jika ya, maka cetaklah
!---
, geser berdasarkan sepersepuluh dari nilai jam dinding kedua. Ini memberikan efek animasi.(Semua hal buruk di sekitar
new Date
hanya ada di sana untuk mengubah nilai tanggal menjadi angka antara 0 dan 3.)Jika tidak, jika kita tidak menggunakan karakter animasi, cetak
i
karakter indeks dari string yang ditentukan olehArtinya, string kode yang
z
dikelilingi oleheval('
dan')
.Terakhir, keluarkan string dan gunakan
setTimeout
untuk mengantrekan eksekusi lain dariz
:Perhatikan bahwa hasil akhir saya tidak cukup tepat - saya belum menyumbang backslashes menuju akhir - tetapi masih harus memberikan Anda ide yang baik cukup tentang bagaimana teknik bekerja umumnya.
sumber
Berikut adalah sumber beranotasi. Ps: Saya penulisnya;)
sumber
Berikut adalah versi lain yang disederhanakan secara manual, memindahkan semua inisialisasi dari ekspresi ke dalam pernyataan sendiri:
Inilah yang terjadi:
z
adalah string multiline yang berisi semua kode. Itueval
ed.z
diteruskan kesetTimeout
. Ia bekerja sepertirequestAnimationFrame
daneval
bersama - sama, mengevaluasinya dalam interval pada tingkat setinggi mungkin.p
, buffer string yang akan ditambahkan HTML, dann
, array bilangan yang dikodekan dengan basis 36 (digabungkan menjadi string oleh"4"
, komentar menjadi sampah yang tidak relevan yang tidak dipertimbangkan olehparseInt
).n
menyandikan satu baris (n.length == 16
). Sekarang disebutkan .e
literal array tetapi kemudian dimasukkan ke angka (x
) atau boolean (r
) atau string (t
) saat digunakan.t
tersebut dihitung, membalikkan booleanr
setiap putaran. Untuk sudut yang berbedax
, dan bergantung pada waktu saat ininew Date / 1000
(sehingga memberikan animasi), arraye
diisi menggunakan beberapa operator bitwise - dengan1
whenr
is false dan2
s whenr
is true pada saat itu.x=0
122 menjadi 122 dalam langkah ganda, menambahkan karakter tunggal kep
.B
sebagai garis miring terbalik, stringS
dibangun dari string kodez
dengan mengosongkan garis miring terbalik dan apostrof, untuk mendapatkan representasi akurat dari apa yang terlihat di sumber.e
ditambahkan dan digunakan untuk mengakses karakter dari" *#"
, untuk membangun gambar animasi. Jika salah satu indeks tidak ditentukan,NaN
indeks memutuskan ke karakter yang tidak ditentukan dan sebagai gantinya karakter terkait dariS
string diambil (lihat rumusnyax/2+61*y-1
). Jika karakter itu harus berupa karakter kata , warnanya berbeda menggunakanfontcolor
metode String .p
, dan string HTML ditugaskan ke badan dokumen.Berikut contoh lainnya:
( demo di jsfiddle.net )
Ia memiliki semua hal relevan yang Anda butuhkan untuk jenis animasi ini:
setInterval
danDate
untuk animasinyaRekonstruksi kodenya sendiri ( seperti quine ), di sini:
Output melalui
document.body.innerHTML
dan<pre>
elemensumber
Sebuah string dengan semua kodenya dievaluasi, dan batas waktu membuat loop; String disimpan dalam variabel bernama
z
dan di tengah kode, di antara komentar/*
dan*/
ada "Seni ASCII Bumi". Kode mem-parsing komentar dan mengubah konten dokumen, mempertahankan js dan memperbarui seni. Di bawah ini hanyalah potongan kode:sumber