2012-02-23 28 views
6

giả sử tôi có một chức năng:Nhận tên hàm từ bên trong bản thân

function test1() { 

     } 

Tôi muốn quay trở lại "test1" từ bên trong chính nó. Tôi phát hiện ra rằng bạn có thể làm arguments.callee mà sẽ trả lại toàn bộ chức năng và sau đó làm một số regex xấu xí. Có cách nào tốt hơn không?

còn các chức năng không gian tên thì sao?

là nó có thể để có được tên của họ cũng như: ví dụ .:

var test2 = 
{ 
foo: function() { 
    } 
}; 

Tôi muốn quay trở lại foo ví dụ này từ bên trong chính nó.

cập nhật: cho đối số.callee.name Chrome trả về trống, IE9 trả về không xác định. và nó không hoạt động với các chức năng phạm vi.

+1

thể http://stackoverflow.com/questions/2648293/javascript-get-function-name dup – ajax333221

+0

thể trùng lặp của [Có chức năng javascript biết tên của nó] (http: //stackoverflow.com/questions/5599513/does-javascript-function-know-its-name) và [Nhận tên hàm trong javascript] (http://stackoverflow.com/q/3178892/218196). –

Trả lời

8
var test2 = { 
    foo: function() { 
    } 
}; 

Bạn không đặt tên hàm. Bạn đang chỉ định thuộc tính foo của test2 cho một chức năng ẩn danh.

arguments.callee.name chỉ hoạt động khi các hàm được khai báo sử dụng cú pháp function foo(){}.

này nên làm việc:

var test2 = { 
    foo: function foo() { 
     console.log(arguments.callee.name); // "foo" 
    } 
}; 
+4

Điều đáng chú ý là 'arguments.callee' và' arguments.caller' không được chấp nhận. –

+1

Và lưu ý rằng khi hàm chạy nó không biết rằng nó "thuộc" vào 'test2'. (Bởi vì nó không "thuộc về", nó chỉ là 'test2' xảy ra để có một thuộc tính' foo' tham chiếu hàm, bạn có thể tạo các tham chiếu khác cho cùng một hàm. Tùy thuộc vào cách bạn gọi nó là _may_ có một 'this' tham chiếu đến đối tượng đó.) – nnnnnn

+1

Không có trong IE 8 trở xuống, đây là kiểm tra tốt về [biểu thức hàm có tên] (http://kangax.github.com/nfe/) và tại sao chúng không phải là một ý tưởng hay . – RobG

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