作爲我正在構建的Web應用程序的一部分,多個命令可以立即從服務器進入。當範圍函數發生Javascript範圍問題
當這些命令被處理時,數據往往會被更新,然後會產生相當大的頁面HTML生成。
當多個相似的命令進來時,程序將處理數據,然後每次都會重新生成部分頁面。這可能會導致大量浪費的處理時間。
因此,我試圖做一個調用堆棧,所以當一個命令被處理時,它會查看命令觸發的函數是否在堆棧中,如果沒有找到它會添加它。
我的問題是保持被調用的函數從調用堆棧在正確的範圍內,同時也能夠消除重複。
基地代碼:
var tools = {
functions:{
function1: function(){
return this;
},
function2: function(){
}
},
unique: function(arr){
var returnArr=[],
x, i;
for (x=0; x<arr.length; x++){
for (i=(x+1); i<arr.length; i++){
if (arr[x]===arr[i]){
arr.splice(i, 1);
}
}
returnArr.push(arr[x]);
}
return returnArr;
}
}
實施例1:
var callstack=[tools.functions.function1, tools.functions.function1];
callstack = tools.unique(callstack);
for (var x=0; x<callstack.length; x++){
console.log(callstack[x](), "should equal tools.functions");
}
此失敗 「本」 將返回[函數()]
實施例2:
var callstack=[
(function(){return tools.functions.function1()}),
(function(){return tools.functions.function1()})
];
callstack = tools.unique(callstack);
for (var x=0; x<callstack.length; x++){
console.log(callstack[x](), "should equal tools.functions");
}
這會失敗,因爲您不能確保函數是唯一的,所以它仍然會運行兩次函數。
這可以通過周圍使用兩個陣列(一個信守的函數名的軌道,一個持有封裝功能),並保持它們同步進行工作,但我不禁覺得有必須是使用.call的更清晰的方式,但我看不到它。
的jsfiddle:http://jsfiddle.net/Kj6E8/
謝謝,我去了這個修改後的版本。 http://jsfiddle.net/DCk8c/ – Doug