2009-01-30 34 views
47

Làm cách nào để kết nối một sự kiện với tên hàm mà tôi đã xác định là một chuỗi?Gọi tên hàm JavaScript bằng chuỗi?

Tôi đang sử dụng Prototype.js, mặc dù đây không phải là Prototype-speficic.

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

Điều này sẽ dẫn đến JavaScript phàn nàn rằng trình xử lý của tôi không phải là chức năng. Tôi không muốn chúng tôi sử dụng eval().

+0

thể trùng lặp của [Làm thế nào để thực hiện một Hàm JavaScript khi tôi có tên của nó dưới dạng một chuỗi] (http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a- chuỗi) – olibre

Trả lời

79

Nếu chức năng là trong phạm vi toàn cầu, bạn có thể lấy nó bằng cách sử dụng đối tượng cửa sổ:

var myFunc = window[myFuncName]; 
+11

... hoặc phạm vi [myFuncName] nói chung – annakata

+0

Yup, miễn là bạn có một xử lý cho phạm vi một nơi nào đó, điều này sẽ làm việc – Greg

+0

Điều này đã cứu mạng tôi. Cảm ơn một triệu lần. – Alex

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

... hay này [myFuncName];

+0

Giải pháp không được kiểm soát. Xin vui lòng lấy upvote của tôi. – woodhead92

3

Có vẻ như formData.fields[x].onclick giữ tên của chức năng toàn cầu? Nếu vậy hãy thử:

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

Bạn có biết thuộc tính onclick có chứa hoặc loại đó là gì không? Tôi cho rằng đây là nguyên mẫu cụ thể, vì "các trường" không tồn tại trong các biểu mẫu DOM.

9

Tôi đã làm việc về vấn đề này, vì tôi cần một chức năng như thế này. Đây là mã sandbox của tôi, không được kiểm tra kỹ lưỡng, nhưng có thể là điểm khởi đầu cho những người khác. Lưu ý rằng có một eval() trong mã như tôi không thể tìm ra cách bỏ qua bước đó, có thể là một javascript quirk và không thể được thực hiện theo bất kỳ cách nào khác. Hãy cho tôi biết nếu có cách nào để loại bỏ eval() ở đây!

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'); 
+0

Để loại bỏ eval, bạn có thể điều hướng các không gian tên từ đối tượng cửa sổ: 'var func = window; cho (var i = 0; i

+0

Cảm ơn Ikon. Tôi đã thử nhiều cách, câu trả lời này sẽ giải quyết vấn đề của tôi. –

5

Có lẽ?

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

Chỉ cần một eval sẽ thực hiện công việc

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

Tuyệt vời! điều này làm việc ... cảm ơn; Bạn đã quên. ở giữa. 'var call = eval (" mathod_name ") gọi (args); ' – RY35

0

Nếu bạn cần phải gọi một hàm chuỗi với lập luận, làm điều này:

window[stringFunctionName].apply(window, arrayOfArguments) 

Bạn có thể sử dụng scope ở vị trí của window nếu được ưa thích

0

cập nhật: --- sử dụng xuất khẩu và nhập 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]() 

Những phương pháp trên luôn không được khuyến cáo bởi một số lý do, nhưng họ thực sự thuận tiện để sử dụng. Những phương pháp dưới đây là an toàn, nhưng thực sự không phải conveninet để sử dụng.

  • switch ... case (hoặc if ... else)

    switch(str){ 
        case 'str1': 
         fn1() 
         break 
        case 'str2': 
         fn2 
         //and so on 
    } 
    
  • chức năng đặt trong một đối tượng

    const fn={ 
        str1:fn1, 
        str2:fn2 
        //and so on 
    } 
    fn[str1] //call function 
    
+0

Làm cách nào để trả lời câu hỏi? –

Các vấn đề liên quan