簡體   English   中英

使用javascript訪問呼叫者本地人

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM