2009-01-30 208 views
47

如何將一個事件連接到我定義爲字符串的函數名稱?使用字符串調用JavaScript函數名稱?

我正在使用Prototype.js,雖然這不是Prototype-speficic。

$(inputId).observe('click', formData.fields[x].onclick); 

這會導致JavaScript抱怨我的處理函數不是函數。我不希望我們使用eval()

+0

可能重複[如何執行JavaScript函數,當我有一個字符串的名稱](http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-字符串) – olibre 2013-11-08 10:15:52

回答

79

如果該功能是在全球範圍內,你可以使用它的窗口對象得到:

var myFunc = window[myFuncName]; 
+11

...或範圍[myFuncName]一般 – annakata 2009-01-30 20:02:19

+0

是的,只要你有一個處理範圍的地方,這將工作 – Greg 2009-01-30 20:06:41

+0

這救了我的命。感謝一百萬次。 – Alex 2012-11-30 13:09:03

3
window.myFunction === window["myFunction"] 
6

...或者這個[myFuncName]

+0

低估的解決方案。請採取我的upvote。 – woodhead92 2017-05-04 03:27:01

3

看起來像formData.fields[x].onclick擁有全局函數的名稱?如果是這樣,請嘗試:

$(inputId).observe('click', window[formData.fields[x].onclick]); 
1

你知道onclick屬性包含什麼或它是什麼類型?我認爲這是原型特定的東西,因爲「字段」不存在於DOM表單中。

9

我已經解決了這個問題,因爲我需要這樣的功能。這是我的沙盒代碼,沒有經過徹底測試,但可以成爲其他人的起點。 請注意,代碼中有一個eval(),因爲我無法弄清楚如何繞過該步驟,也許是一個JavaScript怪癖,無法以其他方式完成。讓我知道是否有辦法擺脫eval()在這裏!

executeFunctionByName = function(functionName) 
{ 
    var args = Array.prototype.slice.call(arguments).splice(1); 
    //debug 
    console.log('args:', args); 

    var namespaces = functionName.split("."); 
    //debug 
    console.log('namespaces:', namespaces); 

    var func = namespaces.pop(); 
    //debug 
    console.log('func:', func); 

    ns = namespaces.join('.'); 
    //debug 
    console.log('namespace:', ns); 

    if(ns == '') 
    { 
     ns = 'window'; 
    } 

    ns = eval(ns); 
    //debug 
    console.log('evaled namespace:', ns); 

    return ns[func].apply(ns, args); 
} 


core = { 
    paragraph: { 
     titlebar: { 
      user: "ddd", 
      getUser: function(name) 
      { 
       this.user = name; 
       return this.user; 
      } 
     } 
    } 
} 

var testf = function() 
{ 
    alert('dkdkdkd'); 
} 

var x = executeFunctionByName('core.paragraph.titlebar.getUser', 'Ikon'); 
executeFunctionByName('testf'); 
5

也許吧?

setTimeout ("myFunc()", 1); 
3

只是一個eval將做的工作

var call = eval("method_name").call(args); 
0

如果您需要調用帶有參數的字符串函數,這樣做:

window[stringFunctionName].apply(window, arrayOfArguments) 

可以代替window使用scope如果優選

0

更新:--- 使用ES6導出和導入

a.js

const fn = { 
    aaa: function() { 
    //code 
    }, 
    bbb: function() { 
    //code 
    }, 
    //codes .... 
    nnn: function() { 
    //code 
    } 
} 

export default fn 

b.js

import someFn from './a' 
    //eg 
    const str1='aaa' 
    const str2 = 'bbb' 

    someFn[str1]() 

這些方法就永遠不能被某些原因建議,但他們真的很方便使用。 以下這些方法是安全的,但實際上並不便於使用。

  • 開關...情況下(或者,如果...否則)在一個對象

    switch(str){ 
        case 'str1': 
         fn1() 
         break 
        case 'str2': 
         fn2 
         //and so on 
    } 
    
  • 放功能

    const fn={ 
        str1:fn1, 
        str2:fn2 
        //and so on 
    } 
    fn[str1] //call function 
    
相關問題