Autor Zpráva
Juraj Jeremenko
Profil *
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);
vypíše:
[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
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
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 *
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
Juraj Jeremenko:
Fuguje, ale dělá něco jiného než čekáš. Zavolej ji: x[0](123)
Juraj Jeremenko
Profil *
A co teda dělá ten řádek
s[y(o)]=x[o]
za předpokladu, že x již je definované. To tam pouze uloží tu funkci? V tom nějak nevidím smysl. y(o) smysl dává, to vrací nějaký string.


rozuměj x[60] nebo x[58] apod.
_es
Profil
Juraj Jeremenko:
A co teda dělá ten řádek
s[y(o)]=x[o]
za předpokladu, že x již je definované.
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 *
_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
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 *
_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));      
dostanu toto:

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
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 *
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
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 *
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]
je v JS to samé jako
[pre]x[1] , x[2], x[3]
?
juriad
Profil
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
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 *
_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
juriad [#15]:
Alebo jazyk python.

Juraj Jeremenko:
"byl správný"
Tak to prosím vysvetli zrozumiteľnejšie.
Juraj Jeremenko
Profil *
Kubo2:
Zřejmě je to nad moje schopnosti.
_es
Profil
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 *
_es:
Máš pravdu, teda určitě to x jsem doplnil, dal jsem tam pole z naparsovaného stringu.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: