Създаването на обект два пъти води до различни резултати

Имам 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

РЕДАКТИРАНЕ: Открих защо работи в емулатора. Емулаторът използва различен javascript двигател. Той използва JSC вместо V8. Има кодов фрагмент в http://code.google.com/p/android/issues/detail?id=12987, който ви помага да разберете какъв двигател използва. Емулаторът използва JSC, Samsung Galaxy S използва V8.


person dan gibson    schedule 18.10.2011    source източник
comment
Това е грешка в внедряването на ECMAScript, както и да се нарича. :-)   -  person RobG    schedule 18.10.2011
comment
Определено е бъг, но чий? Samsung? V8? Изпращам имейл на Samsung, но кой знае дали ще го препратят на правилния човек или просто ще го игнорират.   -  person dan gibson    schedule 18.10.2011
comment
Бих го подавал в Samsung. Потърсете други браузъри, използващи същата скриптова машина, и вижте дали имат същия бъг - ако го намерите, подайте бъг на всеки, който разработва V8 (Google?). Ако са го поправили в по-късна версия, зависи от Samsung да актуализира своя браузър до по-новата версия.   -  person RobG    schedule 18.10.2011
comment
Създаде проблем в инструмента за проследяване на грешки на Android: code.google.com/p /android/issues/detail?id=20889   -  person dan gibson    schedule 18.10.2011


Отговори (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(); // ?
person Nikkoli    schedule 19.10.2011