所以我遇到的問題是我有一個函數,它在閉包中使用一個變量,當它測試它時,它返回一個對它的作用域中的變量的引用。我的代碼看起來類似於以下內容:測試使用閉包變量的Javascript函數的最佳方法?
var app = function() {
var theString = "";
//Appends ztvars onto the url passed into the function
var appendString = function(url) {
if (theString.length === 0) {
return url;
}
return url+theString;
};
//Used for testing, returns the function appendPageVars
this.returnFunctions = function() {
return { appendString: appendString };
}
}
而且使用QUnit的測試代碼如下所示:
var theApp = new app();
appFunctions = theApp.returnFunctions();
test('appendString()', function() {
var theString = "TestString";
var theUrl = "http://www.test.com";
equals(appFunctions.appendString(testUrl), theUrl+theString, "Checking the string appended to the url"); //Fails
});
的問題是,經過功能,即使回測試appendString功能仍持有對應用程序範圍內定義的theString的引用。
我已經設法通過使用eval創建函數的副本,而不是直接使用它像這樣來解決這個問題:
var theApp = new app();
appFunctions = theApp.returnFunctions();
test('appendString()', function() {
var theString = "TestString";
var theUrl = "http://www.test.com";
eval("var appendString = "+appFunctions.appendString.toString());
equals(appendString(testUrl), theUrl+theString, "Checking the string appended to the url"); //Passes
});
但是我一直被教導要避免EVAL等我想知道有沒有更好的方法來做到這一點?我在這裏錯過了什麼,或者這是應該如何完成的?
這是一個語法錯誤:'this.returnFunctions(){' – 2012-02-13 03:17:24
好吧,這就是JavaScript的工作原理。它具有靜態範圍。我不確定在執行函數時可以模擬動態範圍... – 2012-02-13 03:20:18
@ŠimeVidas - 感謝語法錯誤已得到解決。所以沒有更好的方法來做到這一點? – Tim 2012-02-13 03:28:32