모두들 안녕,
간단한 예제 스크립트가 있습니다. 누군가 여기에서 변수의 범위가 무엇인지, 왜 한 가지 방식으로만 작동하고 다른 방식으로는 작동하지 않는지 설명해 주시겠습니까?
초기 스크립트는 다음과 같습니다.
Names default to here(1);
Clear Globals();
x="Variable";
exprA = Expr(Write("Here is variable: "||x));
exprB = Expr(
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );dt1 << OnClose(exprA));
exprB;아이디어는 테이블을 열고 테이블이 닫힐 때 실행해야 하는 표현식을 제공하는 것입니다. 표현식은 스크립트의 일부 변수를 평가하고 변경합니다(이 예에서는 아님).
작성된 방식은 작동하지 않습니다. 아무 일도 일어나지 않지만 실제 스크립트에서는 참조를 찾을 수 없다고 말합니다.
자, ExprA를 전역적으로 만들어 보겠습니다.
Names default to here(1);
Clear Globals();
x="Variable";
::exprA = Expr(Write("Here is variable: "||x));
exprB = Expr(
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );dt1 << OnClose(exprA));
exprB;이제 표현식이 표시되지만 x 변수가 표시되지 않기 때문에 여전히 작동하지 않습니다.
좋아, x도 전역적으로 만들자:
Names default to here(1);
Clear Globals();
::x="Variable";
::exprA = Expr(Write("Here is variable: "||x));
exprB = Expr(
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );dt1 << OnClose(exprA));
exprB;이제 작동합니다.
Scriptable[]Here is variable: Variable
// Close Data Table: Big Class
Close( "Big Class" );
질문: 왜 이런 식으로 작동하고 초기 방식으로는 작동하지 않습니까? 나는 그것이 효과가 있었어야 했다.
나는 이 스크립트에서 전역 변수를 사용하는 것을 좋아하지 않습니다. 작동하게 하는 다른 방법이 있습니까?