Autor Zpráva
juriad
Profil
Přidal jsem do existujícího projektu ddpowerzoomer a některé skripty přestaly fungovat (server slučuje všechny .js soubory do jednoho). Zjistil jsem, že se žádnému prohlížeči (FF16, IE8, CH) nelíbil poslední řádek ddpowerzoomer.js (ten kde se volá jQuery(document).ready(...)) a to kvůli tomu, že "object is not a function" s drobnými variacemi napříč prohlížeči.

Problém byl v chybějcím středníku na konci volání funkce. Vím, že v javascriptu jsou středníky "nepovinné", ale zajímalo by mě, proč zrovna tady mu chybí?
Podobná situace je například "jQuery.noConflict()" na řádku 9, kde mu ale středník nechybí...

reálný kus problematického kódu (tak jak dorazí do prohlížeče):
jQuery(document).ready(function($){ //initialize power zoomer on DOM load
    ddpowerzoomer.init($)
});
/**
 * Coin Slider - Unique jQuery Image Slider
 * @version: 1.0 - (2010/04/04)
 * @requires jQuery v1.2.2 or later 
 * @author Ivan Lazarevic
 * Examples and documentation at: http://workshop.rs/projects/coin-slider/
 
 * Licensed under MIT licence:
 *   http://www.opensource.org/licenses/mit-license.php
**/

(function($){var params=new Array; a tady dál pokračuje jquery plugin slider, který se neprovede bez označeného středníku
Joker
Profil
juriad:
(server slučuje všechny .js soubory do jednoho)
Není právě to zdroj problémů?
O podobné věci se zmiňuje Chamurappi v tomto příspěvku (poznámka, zbytek vlákna je o něčem jiném).
juriad
Profil
Joker:
ano, slučování ty problémy způsobuje

prohlížeč vyhodnocuje kód nejspíše jako:
jQuery(document).ready(... init powerzoomeru ...)(function($){... definice slideru ...})(jQuery);
očekává tedy, že .ready vrátí funkci, které předá v argumentu anonymní funkci a která vrátí další funkci, kterou zavolá s argumentem jQuery

nenapadlo mě, že by bylo možné chápat kód tímto způsobem
_es
Profil
juriad:
v javascriptu jsou středníky "nepovinné"
Nie je to tak, dajú sa nahradiť koncami riadkov, no nie vždy, koniec riadka nemusí ukončiť príkaz. V JS, na rozdiel od iných jazykov, sú bodkočiarky len oddeľovače príkazov, nie ich „ukončovače“.
peta
Profil
To, co popisujes, je spravne chovani.

a(b).c(function(d){e(f)});
(g)

// upraveno
a.c(h);
(g)

// jiny priklad
a.c(h) // toto muze obecne vratit kod funkce
(g) // a toto je pak jeji parametr, pokud tam ten strednik nedas
Strednik tam nebyl, protoze to byl nejspis posledni prikaz v souboru, ze ktereho jsi to pridal.

Cili je to bez stredniku uplne stejny kod jako toto:
<script>
function b(c) {alert(c);}
function a() {return b;}
a()
('ahoj');
</script>

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: