2013-01-06 32 views
13

Làm cách nào để tạo một hàm có tên động? Một cái gì đó như:Javascript: Tên chức năng động

function create_function(name){ 
    new Function(name, 'console.log("hello world")'); 
} 
create_function('example'); 
example(); // --> 'hello world' 

Ngoài ra chức năng phải là đối tượng hàm để tôi có thể sửa đổi nguyên mẫu của đối tượng.

+0

Bạn có thể giải thích vấn đề bạn đang cố giải quyết không? – Philipp

+0

@Philipp: Ví dụ, OP có thể quan tâm đến việc thay thế một số hàm tạo bằng một hàm tạo khác, nhưng đặt tên giống với hàm tạo ban đầu, vì vậy mã sẽ thấy cùng tên hàm. Đó có thể là một trong những lý do tôi phải đối mặt. Nhưng tôi chắc chắn có những người khác. –

Trả lời

11
window.example = function() { alert('hello world') } 
example(); 

hoặc

name = 'example'; 
window[name] = function() { ... } 
... 

hoặc

window[name] = new Function('alert("hello world")') 
+0

[Thêm một câu trả lời] (http://jsfiddle.net/mE2n5/) trong câu trả lời của bạn. –

+9

Tôi không biết tại sao câu trả lời sai là thứ hạng hign. tác giả cần một hàm được đặt tên trong thời gian chạy, không phải là tên chung để truy cập. –

+0

bài đăng dưới đây là cách tốt hơn để làm hoặc điều này? –

13

Tôi đã chơi xung quanh với điều này trong 3 giờ qua và cuối cùng đã nhận nó ít nhất một chút thanh lịch sử dụng chức năng mới như gợi ý trên các chủ đề khác:

/** 
* JavaScript Rename Function 
* @author Nate Ferrero 
* @license Public Domain 
* @date Apr 5th, 2014 
*/ 
var renameFunction = function (name, fn) { 
    return (new Function("return function (call) { return function " + name + 
     "() { return call(this, arguments) }; };")())(Function.apply.bind(fn)); 
}; 

/** 
* Test Code 
*/ 
var cls = renameFunction('Book', function (title) { 
    this.title = title; 
}); 

new cls('One Flew to Kill a Mockingbird'); 

Nếu bạn chạy mã trên, bạn sẽ thấy kết quả sau đây cho bảng điều khiển của mình:

Book {title: "One Flew to Kill a Mockingbird"}