2014-09-02 40 views
0

我有這個包含函數名的全局變量。我可以在不帶參數的情況下執行該函數,但是在傳遞一些參數後,我會在下面看到這個錯誤。 「遺漏的類型錯誤:未定義是不是一個函數將參數傳遞給並執行存儲在數組中的全局函數

//Globally Called and refilled with function names 
var function_name = new Array(); 

//This is the function that executes the var that contains function name 
function execute(){ 
    var function_count = function_name.length; 
    while (function_count--) 
    { 
     window[function_name[function_count]](arguments); 
    } 
} 

//This is how I add the function with its parameters 
function_name.push("GetStatusDetails("+ sampleData +")"); 

難道你們引導我,這個我牛逼的JavaScript編程。使用上面的函數。感謝大家。

+0

你在哪裏調用'exexute'函數? – Mritunjay 2014-09-02 02:39:40

+0

從按鈕點擊事件和其他...我想這樣,我只是有問題如何傳遞參數。 – user3932204 2014-09-02 02:41:32

+0

請參閱上面的代碼的最後一行。如果您對如何傳遞參數有任何建議。我做錯了嗎?請幫助.. – user3932204 2014-09-02 02:43:21

回答

4

你不能使用這樣的參數。這導致參數pseudo-array被作爲第一個參數傳遞。你需要做的

window[function_name[function_count]].apply(window, arguments); 

然而,正如在評論中提到,你還需要在你的function_name陣列存儲一個純函數的名字,並通過參數execute,如

function_name.push("GetStatusDetails"); 
execute(sampleData); 

但爲什麼你傳遞函數名稱?只需傳遞函數即可。所以:

function_name.push(GetStatusDetails); 

然後你直接調用它,而不是按名稱拉出的window對象:

function_name[function_count].apply(window, arguments); 

如果要排隊功能+爲以後的執行參數,可以再嘗試一些像:

//Array of functions to be called 
var function_array = new Array(); 

//This is the function that executes the functions in the array 
function execute(){ 
    var function_count = function_array.length; 
    while (function_count--) 
    { 
     function_array[function_count](); 
    } 
} 

//This is how I add the function with its parameters 
function_array.push(function() { 
    GetStatusDetails(sampleData); 
}); 

這將是良好的編程習慣來封裝一些本大意如下:

var FunctionQueue = { 
    _queue: [], 
    queue : function(fn) { this._queue.push(fn); }, 
    execute: function() { var fn; while (fn = this._queue.pop()) { fn(); } } 
}; 

FunctionQueue.queue(function() { GetStatusDetails(sampleData); }); 
FunctionQueue.execute(); 
+0

我想在此過程中傳遞參數「function_name.push(GetStatusDetails);」,但您的答案與其他建議最爲接近。 – user3932204 2014-09-02 03:03:10

+0

嗨,先生torazaburo,我最尊敬你的代碼。這是我見過的最好的事情。我到處搜索,你的代碼是最令人驚歎的。非常感謝。只是一個額外的問題陛下,是this._queue.pop()劑量這行代碼刪除數組列表中的函數名稱?有什麼方法不刪除_queue中的數組名稱?我期待着你的回答,非常感謝你。 – user3932204 2014-09-03 01:52:55

+0

好吧,我已經得到了它的陛下。再次感謝。 – user3932204 2014-09-03 02:02:43

0
function_name.push("GetStatusDetails("+ sampleData +")"}); 

在這裏,我們不推回功能,但該功能調用GetStatusDetails(sampleData)的結果。 window不包含簽名的密鑰,因此試圖用window[...]找到它返回undefined。當你試圖用window[...](arguments)調用它時,你就是這樣得到錯誤的,因爲你不能「打電話」undefined

sampleData應在呼叫視線被傳遞到​​,你應該推回函數的名稱:

function_name.push("GetStatusDetails"); 

此外,arguments是自變量,而不是實際的參數數組。 因此 GetStatusDetails()將不得不通過數組來查找實際參數。 去看看@ torazaburo的答案,給出正確的解決方案。

+0

好的,讓我解釋一下吧...這就是我添加函數名稱,包括它的參數function_name.push(「GetStatusDetails(」+ sampleData +「)」);這就是我通過調用execute()來執行它的方式。這將執行包含其參數的推送參數名稱,但失敗。現在,我的問題是我錯誤地將它傳遞給作爲函數存儲的全局變量,並且應該包含它的參數。請。謝謝。 – user3932204 2014-09-02 02:55:46

+0

@ user3932204不,你沒有添加函數名,包括它的參數,你只是傳入字符串'「GetStatusDetails(x)」'(其中'x'是'sampleData')。這個函數從來沒有被調用(我錯誤地說,在我現在編輯的答案中),但是當它用'window [[「GetStatusDetails(x)]」查找時,表達式返回'undefined',因爲窗口不包含名爲'「GetStatusDetails(x)」的屬性,而是函數名稱「GetStatusDetails」。您需要將實際參數傳遞給'execute'(即'execute(sampleData)') – 0x499602D2 2014-09-02 03:01:53

相關問題