[英]access caller locals in javascript
我正在創建一種位於javascript內部的dsl,並且要使其盡可能干凈,重要的是我不必專門將其傳遞給它,它可以將當前的任何內容按名稱范圍-但我想知道這是否真的可能。 如果我在使用函數,是否可以通過調用程序函數訪問局部變量?
我知道您不應該這樣做,但是它全都放在堆棧中,調試器可以做到,而且在javascript中的功能似乎沒有很多限制,因此我想知道是否有一些晦澀的方法,即使它是很亂的。
例如
function dsl( someString ) { // can I access bob and cindy here? } function someRealFunction() { var bob = [1,2,3,4]; var cindy = [1,2,3,8]; return dsl("difference bob and cindy"); }
這與將范圍傳遞給另一個函數的問題稍有不同,因為我不想傳遞范圍 -我只想隱式地選擇那里的范圍。 調試器可以做到,因此從根本上說信息實際上就在那兒-問題是是否可以訪問它。
晦澀的方式-您說;
function dsl( someString ) { // can I access bob and cindy here? eBob=arguments.callee.caller.toString().split("\\n")[2]; eCindy=arguments.callee.caller.toString().split("\\n")[3]; eval(eBob); eval(eCindy); console.log(arguments.callee.caller) console.log("bob", bob); console.log("cindy", cindy); } function someRealFunction() { var bob = [1,2,3,4]; var cindy = [1,2,3,8]; return dsl("difference bob and cindy"); } someRealFunction();
僅出於理論推理和安全考慮。 顯然,不要在類似於生產代碼的任何東西中使用它。
回調/關閉模式可能會滿足您的要求:
function dsl( someString, cb )
{
// can I access bob and cindy here?
cb();
}
function someRealFunction()
{
var bob = [1,2,3,4];
var cindy = [1,2,3,8];
return dsl("difference bob and cindy", cb);
function cb() {
console.log(diff(bob, cindy));
}
}
免責聲明:當然,這里的正確方法是更改您的范例以匹配您使用的語言,並使用@torazaburo建議的回調模式或@Mark M建議的副本中的解決方案。
但是由於您是專門要求“某種晦澀的方式,即使它是非常hacky”的,所以這里是晦澀的hacky方式第二。 將其作為單獨的答案發布是另一種方法。
您可以使用獲取名稱的評估值的getter擴展字符串類。 您需要在調用函數中創建原型,否則getter將沒有正確的范圍。
function dsl( someString ) { // can I access bob and cindy here? console.log(someString.handKeysToKingdom("cindy")); console.log(someString.handKeysToKingdom("bob")); } function someRealFunction() { String.prototype.handKeysToKingdom=function(name){return(eval(name))}; var bob = [1,2,3,4]; var cindy = [1,2,3,8]; return dsl("difference bob and cindy"); } someRealFunction();
我認為大多數JS開發人員都會同意的那種顯而易見的非hacky方式看起來很干凈。
function dsl( someString, params ) { // can I access bob and cindy here? console.log(params['bob']); console.log(params.cindy); return } function someRealFunction() { var dslParams={}; dslParams.bob= [1,2,3,4]; dslParams.cindy = [1,2,3,8]; return dsl("difference bob and cindy",dslParams); } someRealFunction();
使用類似的邏輯,您可以在某種程度上巧妙地濫用函數是對象的事實,並通過在dsl對象上設置參數來傳遞參數。
function dsl( someString ) { // can I access bob and cindy here? console.log(dsl['bob']); console.log(dsl.cindy); return } function someRealFunction() { dsl.bob= [1,2,3,4]; dsl.cindy = [1,2,3,8]; return dsl("difference bob and cindy"); } someRealFunction();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.