Создание объекта дважды приводит к разным результатам
У меня есть javascript-код ниже. В Chrome, Firefox, Android-эмуляторе, Firefox на Samsung Galaxy S (Gingerbread 2.3.3) и Safari на iPod он отлично работает. В родном браузере на Samsung Galaxy S это не так.
Код создает объект и проверяет значения объекта. В первый раз он создает объекты, которые он исправляет. Во второй раз, когда он создает объект, значения неверны.
Является ли это ошибкой в Javascript или V8 или устройстве? Как бы вы решили его решить?
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: Я нашел, почему он работает в эмуляторе. Эмулятор использует другой механизм javascript. Он использует АО вместо V8. В http://code.google.com/p/android/issues/detail?id=12987 есть фрагмент кода, который поможет вам определить, какой движок он использует. Эмулятор использует АО, Samsung Galaxy S использует V8.
Ответы
Ответ 1
Из-за того, как V8 Engine выполняет сборку мусора и кеширование, я думаю, что это не делается с объектом, прежде чем он начнет возвращать результат. Вы пробовали изменить свой код на следующее? Возвращает ли он ожидаемый результат каждый раз с этим кодом?
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(); // ?