當腳本變量未傳遞給函數時,函數如何訪問腳本變量?我有一個沒有輸入參數的函數,它使用腳本變量。
根據我對其他編程語言的理解,函數應該只能訪問傳遞給函數或在函數中定義的變量。
當我運行下面的腳本時,它返回 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();