2011-10-18 4 views
13

私は以下のjavascriptコードを持っています。 Chrome、Firefox、Androidエミュレータ、Samsung Galaxy S(Gingerbread 2.3.3)のFirefox、iPodのSafariではうまく動作します。 Samsung Galaxy Sのネイティブブラウザでは表示されません。オブジェクトを2回作成すると結果が異なります

コードはオブジェクトを作成し、そのオブジェクトの値をテストします。初めてオブジェクトを作成するときは、正しいものです。 2回目にオブジェクトを作成すると、値が正しくありません。

これは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エンジンを使用します。それはV8の代わりにJSCを使用します。 http://code.google.com/p/android/issues/detail?id=12987には、使用するエンジンを理解するのに役立つコードスニペットがあります。エミュレータはJSCを使用し、Samsung Galaxy SはV8を使用します。

+0

ECMAScript実装のバグです。何とか呼ばれています。 :-) – RobG

+0

間違いなくバグですが、誰ですか?サムスン? V8?私はサムスンに電子メールを送っていますが、それを適切な人に転送するのか、それとも無視するのかは分かりません。 –

+0

私はSamsungにそれを提出します。同じスクリプトエンジンを使用している他のブラウザを探して、同じバグがあるかどうかを確認します。見つけたらV8(Google?)を開発した人にバグを報告します。彼らはそれ以降のバージョンでそれを修正した場合、それは最新のバージョンにブラウザを更新するサムスンまでです。 – RobG

答えて

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(); // ? 
関連する問題