当脚本变量未传递给函数时,函数如何访问脚本变量?我有一个没有输入参数的函数,它使用脚本变量。
根据我对其他编程语言的理解,函数应该只能访问传递给函数或在函数中定义的变量。
当我运行下面的脚本时,它返回 14。 为什么这有效? 有没有办法让函数使用的变量更具排他性?
scriptVar = 14;
myFunction = function({},{default local},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();感谢您的帮助。
高级统计建模自动化和脚本编写数据存取实验设计质量和工艺工程回复:当脚本变量未传递给函数时,函数如何访问脚本变量?啊,现在清楚了。我想这表明我多久不使用名称默认为此处(1)...
回复:当脚本变量未传递给函数时,函数如何访问脚本变量?感谢您发现我的错误。 我想说的是变量默认是全局的。
当您调用 Here 名称空间时,您就改变了一些事情。 我修改了您的脚本以说明有效的全局名称空间:
// Names Default To Here( 1 );
Delete Symbols();
fn1 = Function( {x},
fn2 = Function( {x},
2*x;
);
5*fn2(x);
);
Show Symbols();
y = fn1(10);
Show( y );
Show Symbols();
日志显示:
// Global
fn1 = Function( {x},
fn2 = Function( {x}, 2 * x );
5 * fn2( x );
);
// 1 Global
y = 100;
// Global
fn1 = Function( {x},
fn2 = Function( {x}, 2 * x );
5 * fn2( x );
);
fn2 = Function( {x}, 2 * x );
y = 100;
// 3 Global
所以默认情况下 fn2 也是一个全局变量。 必要时,您必须表明您更喜欢使用异常(局部变量)。
回复:当脚本变量未传递给函数时,函数如何访问脚本变量?为了控制函数中变量的范围,我们使用 {default local} 声明。但是函数外部的变量具有全局作用域 - 这就是“scriptvar”对函数可见的原因。为了防止这种行为,我们使用声明“名称默认为此处(1)”。
回复:当脚本变量未传递给函数时,函数如何访问脚本变量?如果我理解凯利的问题,目标是避免无意中使用全局变量,而不是期望的行为。
默认情况下函数是全局的是什么意思?我的理解是,函数仅在其包含的命名空间存在时才持续存在,因此在下面的示例中,fn1 存储在此处命名空间中(或者在没有名称的情况下全局存储,默认为此处(1)),但一旦 fn1 完成,fn2 就会消失正在运行,因此每次 fn1 运行时都会重新创建它。
names default to here(1);
delete symbols();
fn1 = function({},
fn2 = function({},
1
);
);
show symbols();
/*
Returns:
// Here
fn1 = Function( {},
fn2 = Function( {}, 1 )
);
// 1 Here<BR />*/
回复:当脚本变量未传递给函数时,函数如何访问脚本变量?谢谢!
我很欣赏可以用作替代方案的解释和示例。回复:当脚本变量未传递给函数时,函数如何访问脚本变量?默认情况下,变量是全局变量,并且在脚本运行后仍然存在。
为什么在函数定义的表达式中使用全局变量? 如果需要该值,请使用函数参数并在调用该函数时传递该参数。
回复:当脚本变量未传递给函数时,函数如何访问脚本变量?该函数首先在其自己的命名空间中查找以解析符号/变量,然后如果找不到变量,它会在返回缺失值之前逐步查找父命名空间以查找值。请注意,如果变量是在函数内创建的,则在其余代码中将无法访问该变量。我同意这是常见的错误来源。
您可以使用局部函数来确保您正在使用局部变量。这对于常见的迭代变量(如“i”)通常很有帮助,这些变量可能会无意中在嵌套 for 循环中使用。 这是一个例子;
scriptVar = 14;
myFunction = function({},{default local},
local({scriptVar},
functionVar = scriptVar;
return(functionVar);
);
);
returnVar = myFunction(); //Returns empty由于在函数中声明局部变量是一种常见的用例,因此此行为嵌入在“function”函数中:
scriptVar = 14;
myFunction = function({}, {scriptVar = .},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();