2011-10-18 12 views
13

Ho il codice javascript di seguito. Su Chrome, Firefox, emulatore Android, Firefox su un Samsung Galaxy S (Gingerbread 2.3.3) e Safari su iPod funziona perfettamente. Non funziona nel browser nativo del Samsung Galaxy S.Creazione di un oggetto due volte produce risultati diversi

Il codice crea un oggetto e verifica i valori sull'oggetto. La prima volta che crea gli oggetti è corretto. La seconda volta che crea l'oggetto i valori non sono corretti.

Si tratta di un bug in Javascript o V8 o nel dispositivo? Come faresti a risolverlo?

var Padding = function(pleft, ptop, pright, pbottom) { 
    this.top = 20; 
    this.left = 1; 
    this.right = 0; 
    this.bottom = 0; 
    this.left = pleft; 
    this.top = ptop; 
    this.right = pright; 
    this.bottom = pbottom; 
}; 

function testPadding() { 
    var p; 
    p = new Padding(91, 92, 93, 94); 
    alert(p.left.toString() + "," + p.top.toString() + "," + p.right.toString() + "," + p.bottom.toString()); 
} 

testPadding(); // 91,92,93,94 - correct 
testPadding(); // 1,20,93,0 - should be 91,92,93,94 
testPadding(); // 1,20,93,0 - should be 91,92,93,94 

MODIFICA: Ho trovato il motivo per cui funziona nell'emulatore. L'emulatore utilizza un motore javascript diverso. Usa JSC invece di V8. C'è uno snippet di codice in http://code.google.com/p/android/issues/detail?id=12987 che ti aiuta a capire quale motore utilizza. L'emulatore utilizza JSC, il Samsung Galaxy S utilizza V8.

+0

È un bug nell'implementazione di ECMAScript, qualunque sia il suo nome. :-) – RobG

+0

È sicuramente un bug, ma di chi? Samsung? V8? Invio un'email a Samsung ma chissà se lo inoltreranno alla persona giusta o semplicemente lo ignoreranno. –

+0

Vorrei archiviarlo con Samsung. Cerca altri browser che utilizzano lo stesso motore di script e vedi se hanno lo stesso bug: se lo trovi, segnala un bug a chiunque sviluppi V8 (Google?). Se lo hanno risolto in una versione successiva, spetta a Samsung aggiornare il browser alla versione successiva. – RobG

risposta

1

A causa di come il V8 Engine esegue la garbage collection e il caching, immagino che non venga eseguito con l'oggetto prima che inizi a restituire un risultato. Hai provato a cambiare il tuo codice al seguente? Ritorna invece il risultato atteso ogni volta con questo codice?

var Padding = function(pleft, ptop, pright, pbottom) { 
    this.top = (ptop != null) ? ptop : 20; 
    this.left = (pleft!= null) ? pleft: 1; 
    this.right = (pright!= null) ? pright: 0; 
    this.bottom = (pbottom!= null) ? pbottom: 0; 
}; 

function testPadding() { 
    var p; 
    p = new Padding(91, 92, 93, 94); 
    alert(p.left.toString() + "," + p.top.toString() + "," + p.right.toString() + "," + p.bottom.toString()); 
} 

testPadding(); // ? 
testPadding(); // ? 
testPadding(); // ? 
Problemi correlati