2010-02-04 65 views
0

我想在Rhino JavaScript中的函數中定義一個動態變量(特別是嵌入在Java 6中的),但我不想求助於eval,而且我也不想想要通過這個來引用它。基本上,我想利用一個對象,並把每個屬性爲函數的範圍內的無功...類似:Rhino JavaScript和動態範圍var創建

var abc = "value"; 
var context = { abc: 123, xyz: "def" }; 

function test(cx) { 
    for (var p in cx) { 
    this_scope[p] = cx[p]; 
    } 

    println(abc); 
    // DON'T WANT TO HAVE TO DO THIS: 
    // pritnln(this.abc); 
} 

test(context); // prints: 123 
println(abc); // prints: value 

不管你信不信,這是顯著,如果我不得不使用「這「。 (它是一個動態生成的函數,我想用不同的上下文對象反覆調用,並且對每個變量使用「this」將會是非常有害的)。我也想避免抓住一個新的引擎上下文或類似的東西......如果我可以在JavaScript中直接做到這一點(我認爲結果會更快),那將是非常棒的。

+1

這是真的動態範圍,因爲標題暗示,或其他完全?對我來說,動態範圍意味着引用調用者的環境綁定。它是動態的,因爲受限制取決於程序執行流程。爲在靜態範圍中已經可見的名稱制作簡寫名稱似乎是另一回事。 – Anonymoose 2011-12-07 05:55:25

回答

3

所以,基本上你想要的東西,像JS的with? *笑容,鴨和運行*

var abc = "value"; 
var context = {abc: 123, xyz: "def"}; 

function test(cx) { 
    with (cx) { 
     println(abc); 
    } 
} 

test(context); 
println(abc); 

你要知道,一些知名的JS從業者,像道格·克羅克福德,strongly deprecate the use of with

+0

這是我正在尋找的精確的...(我現在覺得啞巴了) – 2010-02-04 23:59:38

+0

請務必考慮'with'的壞處,也就是設置一個當前範圍中不存在的屬性,沒有將它設置在當前的'with'範圍內,它將設置在全局範圍內。 http://jsfiddle.net/EJM6X/ – 2011-10-07 18:25:40

+1

+1在*建議使用'with'後咧嘴笑,躲避和跑步*。 – 2011-10-07 18:27:32