已经有几个关于这个主题的线程,以及脚本指南中的一个部分,但没有一个真正回答我的问题。
我有两个文件,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");
)
函数({参数},<{局部变量}>,)>,脚本)