2011-10-18 9 views
13

Tengo el código de javascript a continuación. En Chrome, Firefox, emulador de Android, Firefox en un Samsung Galaxy S (Gingerbread 2.3.3) y Safari en un iPod funciona bien. En el navegador nativo en el Samsung Galaxy S no es así.Crear un objeto dos veces produce resultados diferentes

El código crea un objeto y prueba los valores en el objeto. La primera vez que crea los objetos es correcto. La segunda vez que crea el objeto los valores no son correctos.

¿Esto es un error en el Javascript o V8 o el dispositivo? ¿Cómo vas a resolverlo?

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 

EDIT: he encontrado por qué funciona en el emulador. El emulador usa un motor de JavaScript diferente. Utiliza JSC en lugar de V8. Hay un fragmento de código en http://code.google.com/p/android/issues/detail?id=12987 que le ayuda a determinar qué motor utiliza. El emulador usa JSC, el Samsung Galaxy S usa V8.

+0

Es un error en la implementación de ECMAScript, como se llame. :-) – RobG

+0

Definitivamente es un error, pero ¿de quién? Samsung? V8? Estoy enviando un correo electrónico a Samsung, pero quién sabe si lo enviarán a la persona adecuada o simplemente lo ignorarán. –

+0

Lo archivaría con Samsung. Busque otros navegadores que usen el mismo motor de scripts y vea si tienen el mismo error; si lo encuentra, presente un error con quien desarrolle el V8 (¿Google?). Si lo arreglaron en una versión posterior, depende de Samsung actualizar su navegador a la versión posterior. – RobG

Respuesta

1

Debido a la forma en que el motor V8 hace la recolección de basura y el almacenamiento en caché, imagino que no se hace con el objeto antes de que comience a devolver un resultado. ¿Has intentado cambiar tu código a lo siguiente? ¿Devuelve el resultado esperado cada vez con este código?

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(); // ? 
Cuestiones relacionadas