Autor | Zpráva | ||
---|---|---|---|
Juraj Jeremenko Profil * |
#1 · Zasláno: 7. 8. 2013, 13:18:28
Na jedněch webových stránkách jsem v js našel funkci která obsahuje tento kód
while(o--){ s[y(o)]=x[o]||y(o)} x=[function(y){ return s[y]}]; y=function(){ return'\\w+' }; Přičemž platí, že 1) proměnná o je číslo, původně hodnota 60 2) proměnná s je objekt/pole , které obsahuje jednociferné číselné indexy a indexy se znaky abecedy A-Z, pod kterými jsou hodnoty typu string. Nutno dodat že funkce y je už definovaná; volá se s argumentem čísla představující ascii hodnotu znaku a vrací alfanumerický znak. Pak se tedy provádí smyčka while , o se zmenšuje od 60 až po 0 . pak se nastavuje x, ale tato část mi není jasná - jak se může dovnitř vkládat funkce a proč? console.log(x); [function()] Možná to v tom cyklu while funguje tak, že pokud x není definování, volá se ta původní funkce y a vrací to alfanumerický znak. Tedy výsledek je např. s["A"]="A"; pak při dalším volání je už x definované a tak se snad s["A"] může přepsat s["A"]=x[o] tedy volá novou funkci y která vrací string z pole s, (vrací s["A"]) Prostě mě udivilo to jakým způsobem se zde používá funkce přímo v poli a jak se to volá. No chápete to? |
||
juriad Profil |
#2 · Zasláno: 7. 8. 2013, 13:39:27
var funkce = function() { alert("funkce"); } var x = []; x[0] = funkce; var funkce2 = x[0]; funkce2(); Všechno výše uvedené chápeš? Takže by tě nemělo překvapit následující: var x = [function() { alert("funkce"); }]; x[0](); |
||
_es Profil |
#3 · Zasláno: 7. 8. 2013, 13:40:16
Juraj Jeremenko:
„jak se může dovnitř vkládat funkce“ Úplne rovnako ako akákoľvek iná hodnota ako je číslo či objekt - funkcia je zároveň aj objekt. |
||
Juraj Jeremenko Profil * |
#4 · Zasláno: 7. 8. 2013, 13:52:09 · Upravil/a: Juraj Jeremenko
juriad:
No nejsem si jistý. Oni přece v tom while cyklu nepoužívají operátor volání, je tam jen x[o]. Myslel jsem že to volá tu funkci s argumentem čísla. Ale toto mi nefunguje: var x = [function(a) { alert("funkce:" + a); }]; x[0](); Tedy nezobrazí se "Funkce: 0" jak jsem očekával |
||
juriad Profil |
#5 · Zasláno: 7. 8. 2013, 13:54:17
Juraj Jeremenko:
Fuguje, ale dělá něco jiného než čekáš. Zavolej ji: x[0](123)
|
||
Juraj Jeremenko Profil * |
#6 · Zasláno: 7. 8. 2013, 14:05:43 · Upravil/a: Juraj Jeremenko
A co teda dělá ten řádek
s[y(o)]=x[o] rozuměj x[60] nebo x[58] apod. |
||
_es Profil |
Juraj Jeremenko:
> A co teda dělá ten řádek s[y(o)]=x[o] Nie je isté, čo to robí, lebo z [#1] sa nedá zistiť, čo je v x .
„To tam pouze uloží tu funkci? V tom nějak nevidím smysl.“ Prečo by to nemalo dávať zmysel? Uloží sa funkcia, ktorá môže byť neskôr použitá. Viď aj Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí. |
||
Juraj Jeremenko Profil * |
#8 · Zasláno: 7. 8. 2013, 15:05:27 · Upravil/a: Juraj Jeremenko
_es:
[#1] chápu tak jak jsem popsal, proto je tam operátor ||. Když x ještě není definované, tak to nedělá nic. Ale pokud už je definované, viz řádek 4 a 5, tak to něco dělat bude. v tom indexu o je prokazatelně číslo. Proč teda nenapsali něco jako x[0] ale napsali x[o]? Není v tom rozdíl? |
||
_es Profil |
#9 · Zasláno: 7. 8. 2013, 19:23:47
Juraj Jeremenko:
„Když x ještě není definované, tak to nedělá nic.“ Ak by x nebolo definovaná, bude vyvolaná výnimka (chyba).
„Ale pokud už je definované, viz řádek 4 a 5, tak to něco dělat bude.“ Áno, do s[y(o)] priradí x[o] alebo y(o) .
„v tom indexu o je prokazatelně číslo. Proč teda nenapsali něco jako x[0] ale napsali x[o]? Není v tom rozdíl?“ Ak je v o kladné celé číslo, tak beží v cykle while postupne od o-1 do 0 .
Nebolo by lepšie si naštudovať najprv základy, než takto polo-slepo tipovať, čo asi robí nejaký cudzí kód? |
||
Juraj Jeremenko Profil * |
#10 · Zasláno: 7. 8. 2013, 19:34:47
_es:
To je mi jasné že se tam děje to přiřazování a že je tam kladné celé číslo, jenže stále nechápu jaký je teda ten výsledek respektive odkud se bere protože tu někdo říkal, že se tam ukládá ta funkce, ale že ta funkce není volána, takže by neměla obsahovat nějaký string nebo tak něco. No když do toho cyklu přidám console.log console.log(x[o]); console.log("index:" + y(o)); EightFiveNineFive index:X NineTwoSixZero index:W 80 index:V 6146 index:U Seven6TwoSix index:T Four8OneEight index:S 11396 index:R NineSixFourOne index:Q atd. Z toho vyplývá, že x je už definované a např. pod indexem s["Q"] se nachází string NineSixFourOne. No ale stále nechápu jak se tam teda ten string dostal, když tu bylo řečeno že se tam má údajně pouze ukládat ta funkce (což ale nekoresponduje s výsledkem, kterým je string a ne funkce). Možná jsem jen nepozorný a něco mi uniklo? |
||
_es Profil |
#11 · Zasláno: 7. 8. 2013, 19:52:14
Juraj Jeremenko:
Ak tu dáš nejaký cudzí nezrozumiteľnejší kód, z ktorého sa nedá zistiť, aké hodnoty čo má, tak sa nesmieš čudovať, že si ich typ diskutujúci chybne tipnú. Odkiaľ mali zistiť, čo je v prvých dvoch riadkoch kódu o s x a y ?
„stále nechápu jak se tam teda ten string dostal“ A odkiaľ to máme „chápať“ my, keď nevieme, čo je pred prvým riadkom? |
||
Juraj Jeremenko Profil * |
#12 · Zasláno: 7. 8. 2013, 19:52:36 · Upravil/a: Juraj Jeremenko
Ještě bych prosil vysvětlit tuto podmínku:
if(!''.replace(/^/,String)) není mi jasné proč se někdo snaží zaměnit prázdný řetězec ... _es: No ale to jsem vysvětlil hned na začátku, že proměnné se kterými se tam pracují jsou o - celé číslo začínající na 60 a postupně se snižující v cyklu až na 0. A druhá proměnná je pole s obsahující alfanumerické indexy ke kterým jsou přiřazeny proměnné typu string..... že funkce y(číslo) vrací znak, jsem taky psal hned na začátku. |
||
_es Profil |
#13 · Zasláno: 7. 8. 2013, 20:01:16
Juraj Jeremenko:
„není mi jasné proč se někdo snaží zaměnit prázdný řetězec ...“ Aby sťažil analýzu svojho kódu, viď cs.wikipedia.org/wiki/Obfusk%C3%A1tor. Je to prevoditeľné na if(true) , pokiaľ nebolo zmenené String alebo/aj metóda replace .
|
||
Juraj Jeremenko Profil * |
#14 · Zasláno: 7. 8. 2013, 21:31:23
Ten kód skutečně ukládá do x výsledek(výsledky) vytažený(vytažené) z toho pole s. Takže důvod toho argumentu o ve výrazu x[o] bude nejspíš ten, že se tím přistupuje ke konkrétnímu indexu. Takže tím x[o] se volá ta anonymní funkce, která vytáhne řetězec a uloží ho do x pod příslušný index o. Alesopň tak tomu teda rozumím po sledování hodnot v té funkci.
Jinak se chci ještě zeptat jestli toto x[-1] , x[-2], x[-3] [pre]x[1] , x[2], x[3] ? |
||
juriad Profil |
#15 · Zasláno: 7. 8. 2013, 21:59:03
Je x[1] a x[-1] to samé?
Není a můžeš si to lehce vyzkoušet. Snad jediné místo, kde něco jako záporné indexy existuje, jsou argumenty metody Array.slice |
||
1Pupik1989 Profil |
#16 · Zasláno: 7. 8. 2013, 22:06:36
Mezi námi funkce v poli, která se při každé iteraci vytvoří znovu je nesmysl.
|
||
_es Profil |
Juraj Jeremenko:
Z úmyselne nečitateľného kódu skutočne nič veľmi zmysluplného nevyčítaš. Inak z kódu v [#1] nemá zmysel uvažovať nad viac ako prvými dvomi riadkami, lebo x a y v nasledujúcich riadkoch s nimi nesúvisia.
|
||
Juraj Jeremenko Profil * |
#18 · Zasláno: 8. 8. 2013, 10:17:12
_es:
Ale mě se to už povedlo rozluštit a celé převést do jiného jazyka, můj první výklad (ten co tu celou dobu dookola opakuji) byl tedy správný. |
||
Kubo2 Profil |
#19 · Zasláno: 8. 8. 2013, 10:46:37
juriad [#15]:
Alebo jazyk python. Juraj Jeremenko: "byl správný" Tak to prosím vysvetli zrozumiteľnejšie. |
||
Juraj Jeremenko Profil * |
#20 · Zasláno: 8. 8. 2013, 11:31:15
Kubo2:
Zřejmě je to nad moje schopnosti. |
||
_es Profil |
#21 · Zasláno: 8. 8. 2013, 11:48:09
Juraj Jeremenko:
„můj první výklad (ten co tu celou dobu dookola opakuji) byl tedy správný“ To ťažko, spájal si navzájom nesúvisiace časti z kódu v [#1], dal si nedostatočné informácie (Aká je hodnota x v riadkoch 1. a 2.?). A máš zmätok v tom, čo a kedy sa „prepisuje“ - riadky 4. až 9. neovplyvnia to, čo bude v s .
|
||
Juraj Jeremenko Profil * |
#22 · Zasláno: 8. 8. 2013, 13:19:43
_es:
Máš pravdu, teda určitě to x jsem doplnil, dal jsem tam pole z naparsovaného stringu. |
||
Časová prodleva: 11 let
|
0