创建对象两次会产生不同的结果

13

我有以下JavaScript代码。在Chrome、Firefox、Android模拟器、Samsung Galaxy S上的Firefox和iPod上的Safari上均正常工作。但是,在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,三星Galaxy S使用V8。


这是 ECMAScript 实现中的一个错误,不管它被称为什么。 :-) - RobG
这绝对是一个 bug,但是是谁的问题呢?三星?V8?我正在给三星发电子邮件,但谁知道他们是否会将其转发给正确的人或者只是忽略它。 - dan gibson
我会向三星提交此问题。寻找使用相同脚本引擎的其他浏览器,看看它们是否有相同的错误 - 如果发现,请向开发V8引擎的人(Google?)提交错误报告。如果他们在较新版本中修复了该问题,则由三星更新其浏览器到较新版本。 - RobG
在Android错误跟踪器上创建了一个问题:http://code.google.com/p/android/issues/detail?id=20889 - dan gibson
1个回答

1
由于V8引擎如何进行垃圾回收和缓存,我想它在返回结果之前可能还没有完成对象的处理。您尝试过将代码更改为以下方式吗?使用此代码是否每次都返回预期结果?
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(); // ?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接