2015-01-08 10 views
9

これはコードの多くがスキップされているように見える非常に奇妙な動作です(MacのChromeでのみ発生します)。変数が「未定義」に設定されている可能性があります

ここにChromeの開発ツールのスクリーンショットがあります。 817行目は決してヒットしなかったことに注意してください。しかし、833がヒットし、私たちが見ているのは、ヒットした例外です。私はこの混乱を見つけるために呼び出しスタックを調べました。変数 "loc"、 "lon"、 "tc"はすべて定義されていないことに注意してください。各変数は822行、823/824、827/831行で評価されているため、使用できません。計算にエラーがあった場合、これらの変数の値は私の理解からNaNでなければなりません。

screenshot from Chrome Developer Tools

ここでは、実際のコードです:

function getCircle2(latin, lonin, radius) { 
    var locs = new Array(); 
    var lat1 = latin * Math.PI/180.0; 
    var lon1 = lonin * Math.PI/180.0; 
    var d = radius/3956; 
    var x; 
    for (x = 0; x <= 360; x++) { 
     var tc = (x/90) * Math.PI/2; 
     var lat = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1) * Math.sin(d) * Math.cos(tc)); 
     lat = 180.0 * lat/Math.PI; 
     var lon; 
     if (Math.cos(lat1) == 0) { 
      lon = lonin; // endpoint a pole 
     } 
     else { 
      lon = ((lon1 - Math.asin(Math.sin(tc) * Math.sin(d)/Math.cos(lat1)) + Math.PI) % (2 * Math.PI)) - Math.PI; 
     } 
     lon = 180.0 * lon/Math.PI; 
     var loc = new VELatLong(lat, lon); 
     locs.push(loc); 
    } 
    return locs; 
} 

は、誰もが、この魔法にいくつかの光を当てることができますか?なぜブレークポイントが無視され、Mac上のChromeで変数の値が正しくないのですか?

編集:

私はバグを修正したようです。私がしたことは、それ自体の関数でブレークコードを分離し、関数を一度呼び出すことでした。例外がスローされた場合は、もう一度呼び出すと100%時間がかかるようです。私はまだ問題の根本原因が何かに興味があります。

//new function to isolate the exception 
function getCirclePointOnRadius(deg, lat1, lon1, d, attempt) { 
    attempt = attempt || 1; 
    var maxAttempts = 2; 
    try { 
     var tc = (deg/90) * Math.PI/2; 
     var lat = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1) * Math.sin(d) * Math.cos(tc)); 
     lat = 180.0 * lat/Math.PI; 
     var lon; 
     if (Math.cos(lat1) == 0) { 
      lon = lonin; // endpoint a pole 
     } 
     else { 
      lon = ((lon1 - Math.asin(Math.sin(tc) * Math.sin(d)/Math.cos(lat1)) + Math.PI) % (2 * Math.PI)) - Math.PI; 
     } 
     lon = 180.0 * lon/Math.PI; 
     var loc = new VELatLong(lat, lon); 
     return loc; 
    } 
    catch (e) { 
     console.log2('Error when gathering circle point "' + e + '", trying again', deg, lat1, lon1); 
     if (attempt < maxAttempts) { 
      return getCirclePointOnRadius(deg, lat1, lon1, ++attempt); 
     } 
     else { 
      return 0; 
     } 
    } 
} 

そして私は(getCircle2に)もともとロジックを開催したループを交換する:あなたは、変数の巻上げの犠牲者であるかもしれないよう

for (x = 0; x <= 360; x++) { 
     locs.push(getCirclePointOnRadius(x, lat1, lon1, d)); 
    } 
+0

ローカルファイルまたはjsfiddle/codepenのようなWebサイトでデバッグしていますか? – A1rPun

+0

はい。これは.Netソリューションです。運用ファイルには同じエラーが表示されますが、縮小されたjavascriptファイルが使用されます。 –

+0

WindowsのChromeでうまく機能しますか? –

答えて

3

に見えますhttp://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

ライン833であります関数スコープ内の変数名宣言としておそらく吊り上げられています。変数の宣言をリファクタリングすると、問題が解決される可能性があります。

+0

それは面白い読書でした! +1 –

+0

ええ、私はあなたが間違っていると思う、サイモン。記事を読むことはそうであるようです。使用される変数はどこでも参照され、グローバルスコープに存在するように見えます。 –

関連する問題