이미 이 주제에 대한 여러 스레드와 스크립팅 가이드의 섹션이 있지만 내 질문에 대한 답변은 없습니다.
Main.jsl과 Function.jsl이라는 두 개의 파일이 있고 후자의 파일을 전자에 포함합니다. Main.jsl의 For 루프 내부에서 호출하려는 Function.jsl에 정의된 함수가 있습니다. 내가 가진 문제는 호출된 Function도 For 루프를 사용하고 Main.jsl의 For 루프와 Function.jsl의 Function 모두 i를 계수 변수로 사용하므로 네임스페이스 오염이 발생한다는 것입니다.
두 파일의 다른 위치에서 Names Default Here(1)를 사용하고, Include()에서 << New Context 인수를 사용하고, ::를 사용하여 함수 이름을 전역 변수로 정의하는 등 여러 가지 조합을 시도했습니다. 이 문제를 해결하려고 합니다. 그러나 문제는 항상 1) Main.jsl에서 Function.jsl의 함수를 호출할 수 있지만 네임스페이스 오염이 있거나 2) Main.jsl에서 Function.jsl의 함수를 호출할 수 없다는 것입니다. Main.jsl 함수가 내가 액세스하는 방법을 모르는 네임스페이스 또는 범위에 정의되었기 때문입니다.
현재 내 해결 방법은 i와 Local() 내부의 전체 Function 내용을 명시적으로 정의하고 Function 자체를 다음과 같이 전역 변수로 정의하는 것입니다.
Main.jsl
Include("Function.jsl", << New Context);
Names Default To Here(1);
for(i = 1, i <= 10, i++,
returns = ::function(arguments);
);함수.jsl
::function = Function({arguments},
Local({i},
for(i = 1, i <= 20, i++,
Do Something;
);<BR /> Return(returns);
);
);내 질문은 이것이 정말 올바른 방법입니까? 예를 들어, 나는 Function.jsl에 네임스페이스를 할당할 수 있고, 그런 다음 return = ns_function:function(arguments);와 같이 전역 변수를 건드리는 대신 이것을 사용하여 Function을 호출할 수 있다면 더 좋을 것이라고 생각합니다. 이상적으로 이것은 Main.jsl의 i가 Here 네임스페이스에 있고 Function.jsl의 i가 ns_function 네임스페이스에 있기 때문에 네임스페이스 오염도 방지할 수 있습니다. 그러나 이것이 가능한지/어떻게 가능한지 모르겠습니다.
Windows 10 Enterprise 64비트에서 JMP Pro 16.2(570548) 사용.
감사합니다! {Default Local} 플래그를 사용하면 원하는 대로 정확하게 작동합니다.
이 경우 function({arguments}, {기본 로컬} ) 함수에 사용된 모든 범위가 지정되지 않은 변수가 함수에 대해 지역적임을 선언합니다(이것은 내가 시간의 99%를 수행하는 것입니다).
//main.jsl
Names Default To Here(1);
Include("test.jsl");
For(i = 1, i <= 5, i++,
testparam = i;
return = test();
show(i);
show(return);
);
//test.jsl
Names Default To Here(1);
test = function({}, {Default Local},
For(i = 1, i <= 20, i++,
show(i);
);
show(testparam);
return("done");
)
함수({인수}, <{로컬 변수}>, <리턴()>, 스크립트)