2009-03-29 42 views

Trả lời

3

Nếu bạn đang cố gắng gọi MyFunc từ bên trong doSomething, bạn chỉ có thể vượt qua chức năng thực tế:

var someObject = new Object(); 
someObject.MyFunc = function() { alert('test'); } 
function doSomething(func) { 
    func(); 
} 
doSomething(someObject.MyFunc); 
4

Không có một cách thực sự tốt để có được tên hàm. Trong JavaScript, bạn có thể có các hàm ẩn danh và do đó không có cách nào để đặt tên cho chúng.

Trong mọi trường hợp, bạn có thể gặp may mắn khi sử dụng arguments.callee.toSring(). Ví dụ:

function foo() { 
    alert("I am " + arguments.callee.toString()); 
} 

Nhưng điều này không tốt vì không phải tất cả chức năng đều có tên và một số trình duyệt có thể chắp thêm chi tiết triển khai cho chuỗi này.

Nhưng, có lẽ bạn đang cố gắng làm điều gì khác ngoài việc nhận tên? Nếu bạn muốn cuối cùng gọi hàm, bạn thực sự có thể tự chuyển hàm. Đây được gọi là hàm lambda. Ví dụ:

function foo(inFunc) { 
    inFunc(); 
} 

foo(function() { alert("foo"); }); 

Đoạn mã trên tạo ra chức năng ẩn danh bật lên cảnh báo. Sau đó nó được chuyển đến hàm foo mà chỉ cần gọi hàm bất kỳ được truyền vào nó.

-1

Nếu bạn có chức năng này:

function test() 
{ 
    alert('here'); 
} 

Bạn có thể gọi nó theo cách này:

function testTest(func) 
{ 
    func(); 
} 

testTest(test); 
1

Như những người khác đã chỉ ra, nó rất có thể là bất cứ điều gì bạn đang cố gắng làm có thể được thực hiện tốt hơn theo một cách khác. Tuy nhiên, nếu bạn thực sự cần phải tìm tên của một hàm, có một cách khá đơn giản để làm điều này, nhưng nó sẽ không hoạt động trong mọi trường hợp.

//returns the name of the function func on the object obj 
function getFuncName(obj, func){ 
    for(var funcName in obj){ 
    if(obj[funcName] === func){ 
     return funcName; 
    } 
    } 
} 

alert(getFuncName(Object, Object.MyFunc)); //alerts "MyFunc" 

Giới hạn ở đây, là bạn sẽ cần cả đối tượng và chức năng và chức năng sẽ phải lặp lại - nghĩa là nó không thể được tích hợp sẵn.

1

Có lẽ bạn có ý nghĩa như thế này?

function getFn(fnName){ 
    for (var l in yourObj){ 
     if (l === fnName && yourObj[l] instanceof Function){ 
     return [ l, yourObj[l] ]; 
     } 
    } 
    return [fnName ,'not found']; 
} 

vòng lặp lặp lại thông qua đối tượng và cung cấp một tên chứa phương thức và con trỏ đến phương thức (hoặc thông báo lỗi).

2

Đây là câu hỏi cũ, nhưng trong ES6 khả năng này được cung cấp qua thuộc tính Function.name. ECMAScript 2015 Language Specification xác định how this property is added to a Function instance:

9.2.11 SetFunctionName (F, tên, tiền tố)

Các hoạt động trừu tượng SetFunctionName đòi hỏi một Function luận F, một String hoặc Symbol luận name và tùy chọn một tiền tố String tranh cãi. Thao tác này cho biết thêm một tài sản name-F bằng cách thực hiện các bước sau: ...

Thật không may, điều này vẫn chưa được thực hiện trong tất cả các trình duyệt chính: Nó được liệt kê here như không được hỗ trợ trong tất cả các phiên bản IE, và chỉ được hỗ trợ một phần trong tất cả các trình duyệt chính khác (với Edge 13 có hỗ trợ tốt nhất, mặc dù vẫn còn một phần, hiện tại).

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