ログに記録された値 スクリプトの実行時に一致しない値を出力するこんにちは、デフォルト ローカル スコープを使用する関数の動作を理解しようとしています。 つまり、Print ステートメントを使用したときにログに表示される値は、コードが実行された値と一致しません。 たとえば、このスクリプトでは次のようになります。
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
Print("Here:EXAMPLE_VALUE: " || Char(Here:EXAMPLE_VALUE));
Print("EXAMPLE_VALUE: " || Char(EXAMPLE_VALUE));
modal = New Window( "Example Modal",
<<MODAL></MODAL>私のログには次のように表示されます。
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
ただし、モーダルでは次のように表示されます。
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
スクリプティングRe: ログに記録された値 スクリプトの実行で値が一致しない@マットスキー、関数で Default Local 名前空間を宣言する場合、スコープ外のすべての変数はその関数に対してローカルです (を参照)。ここ)。 EXAMPLE_VALUE は関数の外部で宣言されているため、モーダルは、変数参照が Here にスコープされている場合にのみ正しい値を表示します。 関数内で EXAMPLE_VALUE を宣言すると、ローカルになり、関数で使用できるようになりますが、スクリプトの残りの部分からアクセスできるように、Here 名前空間には存在しません。 ここにある名前空間参照に関する役立つページ.
Re: ログに記録された値 スクリプトの実行で値が一致しない名前空間を参照してリンクしたドキュメントによると、ユーザー定義関数については Default Local "参照規則は変更されていません」であり、非限定参照の参照規則には次のように記載されています。
もし名前のデフォルトはここモードがオンの場合、JMP は次の場所で変数を検索します。
そのため、ローカル名前空間に問題の名前のローカル変数がない場合に備えて、Here にフォールバックする必要があるとドキュメントに記載されているようです。
それとは別に、Print ステートメントの動作が、Print が作成されているコンテキストの動作と一致しないことは、私には問題があるようです。
Re: ログに記録された値 スクリプトの実行で値が一致しないJSLでスコープを扱うとき。 あなたがそれらの間を動き回っているなら、私はほとんどいつもはっきり言ってください。私は DAYS を 1 つのスコープの問題のデバッグに費やしました。
Re: ログに記録された値 スクリプトの実行で値が一致しないさらなるデバッグに基づいて、何が起こっているのかを理解していると思います。
更新されたコード:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
// (1)
hereStr = "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE );
unqualifiedStr = "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE );
// (2)
hereStrTextBox = Text Box( "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE ) );
unqualifiedStrTextBox = Text Box( "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE ) );
// (3)
Print( hereStr );
Print( unqualifiedStr );
modal = New Window( "Example Modal",
<<MODAL></MODAL>
(1) では、代入はすぐに評価されるため、後で Print/Text Box に渡されると、期待どおりに定義されます。 これは、(3) の出力と (4) のテキスト ボックスへの最初の出力によって確認されます。
(2) では、行が実行されるときにテキスト ボックスが再度評価されるため、表示されるときに、期待する値を使用して再び定義されます。 これは、(4) の最後の 2 つのテキスト ボックスによって確認されます。
(4) の真ん中の 2 つのテキスト ボックスは、実際にはすぐに評価されませんが、式としてセンター ボックス (またはリスト ボックス?) に渡され、後で/別のスコープで評価されます (どちらかのリスト ボックスのスコープだと思います)。またはセンターボックス)。 結果として、EXAMPLE_VALUE の値は私が期待したものではなく、代わりに評価されている他のスコープでの EXAMPLE_VALUE の値です (つまり、未定義です)。
これは (5) で確認されているようで、後で評価される / 別のスコープで Prints を式として渡します。
これは正確ですか?
Re: ログに記録された値 スクリプトの実行で値が一致しないボックスには独自のスコープがあります。現在、モーダルウィンドウを実行していますが、そうではなく、関数が閉じられ、すべてのローカル変数がなくなったと想像してください。そのようなもののために、私は通常、次のようなことをします。
Names default to here(1);
test = function({something_passed, kwargs={}},
{DEFAULT LOCAL},
// Kwargs
kwarg = Try(kwargs["kwarg"], "default"); // kwarg description
something_not_passed = 14;
nw = new window("Scope",
window:something_not_passed = something_not_passed; // just assignthe variable to the display
window:something_passed = something_passed;
window:something_direct = 42;
buttonbox("OK",
<<SET function=""></SET>