Tôi có một hàm từ một đối tượng, cho phép nói Object.MyFunc. Tôi cần gửi tên hàm này vào một hàm khác như vậy: doSomething ("Object.MyFunc");Làm cách nào để chuyển đổi tên hàm thành chuỗi
mọi lời khuyên?
Tôi có một hàm từ một đối tượng, cho phép nói Object.MyFunc. Tôi cần gửi tên hàm này vào một hàm khác như vậy: doSomething ("Object.MyFunc");Làm cách nào để chuyển đổi tên hàm thành chuỗi
mọi lời khuyên?
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);
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ó.
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);
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.
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).
Đâ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ộtFunction
luậnF
, mộtString
hoặcSymbol
luậnname
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ảnname
-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).