已經有幾個關於這個主題的線程,以及腳本指南中的一個部分,但沒有一個真正回答我的問題。
我有兩個文件,Main.jsl 和 Function.jsl,我將後一個文件包含在前一個文件中。 Function.jsl 中定義了一個函數,我希望在 Main.jsl 中的 For 循環內部調用該函數。 我遇到的問題是,被調用的 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 因為函數是在我不知道如何訪問的命名空間或範圍中定義的。
我當前的解決方法是在 Local() 內顯式定義 i 和整個 Function 的內容,並將 Function 本身定義為全局變量,如下所示:
主要.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 分配一個命名空間,然後用它來調用 Function,而不是弄亂全局變量,比如 returns = ns_function:function(arguments); ,那就更好了。 理想情況下,這也可以防止命名空間污染,因為 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");
)
函數({參數},<{局部變量}>,)>,腳本)