2013-12-17 104 views
2

我在嘗試調用將其名稱存儲在變量中的函數時遇到問題。我發現了一些關於stackoverflow的問題,但仍然無法解決我的問題。 從我的理解,使用變量中的函數名稱

window[functionName](); 

應該叫我想要的功能。我創建了一個jsfiddle,我希望能夠澄清我的問題。 的問題是,這不是我的函數被調用我得到一個錯誤:

window[functionName] is not a function

我相信這是我丟失了一些小東西,但時間長了之後,花了試圖找出問題所在,我決定在這裏嘗試一下。

+0

如果你要稱呼其爲window'的'屬性,你首先必須使你的函數成爲'window'的屬性。 –

+2

這是你的小提琴的問題。默認情況下,jsfiddle自動將代碼封裝在一個準備好的處理程序中,所以你的函數不在全局範圍內。你可以告訴jsfiddle你不想要你的代碼包裝(在你選擇你想要的jquery的左下角):http://jsfiddle.net/Cwhwx/ –

回答

6

因爲你的函數在一個onload處理加入,使他們是本地的gloabl範圍內不可用的方法。

在左側面板的第二個下拉列表中選擇no-wrap header/body,然後將您的jQuery處理程序添加到dom ready處理程序中。

function one() { 
    alert('one called'); 
} 

function two() { 
    alert('two called'); 
} 

function three() { 
    alert('three called'); 
} 

jQuery(function() { 
    jQuery("button").bind("click", function() { 
     var funcName = "one"; 
     window[funcName](); 
     //alert('here'); 
    }); 
}) 

演示:Fiddle

的jsfiddle增加在window.onload = function(){}處理器默認腳本,所以任何函數/變量聲明會有局部的功能範圍,並不會在全球範圍內提供(窗口)

+0

感謝您的回答,我會盡快接受它。還有一個問題。有什麼辦法可以調用在window.onload中創建的函數嗎? – relysis

+0

@relysis請參閱http://jsfiddle.net/arunpjohny/L4B2c/2/ –

+0

非常感謝您的幫助!本來會給+1,但是我的聲望不允許我 – relysis

2

WORKING JS FIDDLE

這句法(從你的例子提琴使用的代碼)的作品就好了。在這裏我明確地將該函數添加到窗口對象。

有很多關於爲什麼這項工程On This Question和Arun P Johny的答案給出了一個體面的解釋信息,但基本上歸結爲表達一個函數和聲明一個函數。

window.one = function() { 
    alert('one called'); 
} 
+3

你應該解釋爲什麼代碼有效,所以OP知道什麼修理。 – srquinn

+0

@jibsales對不起,我在回答後立即跳上即興會議。但現在,這已經得到更徹底的回答,提供一個鏈接到信息資源似乎應該就足夠了。 – Rooster

0

您在設定功能方面存在問題。你可以這樣來做:

我改變你的代碼:

window.one = function(){ 
    alert('one called'); 
} 
window.two = function() { 
    alert('two called'); 
} 
window.three = function() { 
    alert('three called'); 
} 

jQuery("button").on("click", function() { 
    var funcName = window.prompt("What function to fire?",""); 
    window[funcName](); 
}); 

和固定的小提琴: ​​