2011-01-11 39 views
32

Xin lỗi cho danh hiệu thực sự kỳ lạ, nhưng đây là những gì tôi đang cố gắng để làm:Có cách nào để có được chức năng hiện tại từ bên trong chức năng hiện tại không?

var f1 = function (param1, param2) { 

    // Is there a way to get an object that is ‘f1’ 
    // (the current function)? 

}; 

Như bạn thấy, tôi muốn truy cập vào các chức năng hiện từ bên trong một chức năng ẩn danh.

Điều này có khả thi không?

Trả lời

24

Có - arguments.callee là chức năng hiện tại.

LƯU Ý: Điều này không còn được dùng trong ECMAScript 5 và có thể gây ra hiệu suất cho lần truy cập cuộc gọi đuôi và tương tự. Tuy nhiên, nó hoạt động trong hầu hết các trình duyệt chính.

Trong trường hợp của bạn, f1 cũng sẽ hoạt động.

+2

'arguments.callee' không phải là công cụ phù hợp cho tình huống này. Nó không được sử dụng trong chế độ nghiêm ngặt ECMAScript 5 và ngăn các bộ tối ưu hóa nhất định. –

+14

@ Box9 có cách nào khác không? –

+2

@DavidTang có thể không được dùng nữa, nhưng đây là tùy chọn duy nhất có sẵn. Có lẽ họ nên không dùng nó. –

8

Bạn có thể truy cập vào nó với f1 kể từ khi chức năng sẽ được gán vào biến f1trước nó được gọi là:

var f1 = function() { 
    f1(); // Is valid 
}; 

f1(); // The function is called at a later stage 
+1

... thật kỳ lạ nhưng hữu ích. Không hoàn toàn là câu trả lời thích hợp cho câu hỏi (không rõ ràng được kiểm tra), mặc dù, như George muốn tái chế trong một chức năng * nặc danh *. –

+2

@Christian, nó không phải là lạ cả. Khai báo hàm và thực thi hàm là hai điều hoàn toàn khác nhau. Và tôi tin rằng đây là * giải pháp đúng hơn cho câu hỏi của OP - 'var f1 = function() {}' là một hàm ẩn danh. 'hàm f1() {}' thì không. Vui lòng xem http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript vì lý do tại sao 'arguments.callee' nên tránh. –

+1

Ah, tôi hiểu rồi. Thật lạ vì đối tượng 'Hàm' không được xây dựng hoàn toàn tại thời điểm định nghĩa, do đó (trong tâm trí của tôi) không được gán cho' f1'. Tôi nghĩ rằng George đang muốn tái chế trong một hàm ẩn danh, nói, trong một trình xử lý sự kiện JQuery hay cái gì đó. –

35

Tên nó.

var f1 = function fOne() { 
    console.log(fOne); //fOne is reference to this function 
} 
console.log(fOne); //undefined - this is good, fOne does not pollute global context 
+4

Tôi tự hỏi ai downvoted này. Về cơ bản, đây là cách một người truy cập chức năng hiện tại trong chức năng ẩn danh. Và tên được bảo quản ngay cả khi nó được gán cho một đối tượng khác, do đó, đệ quy vẫn có thể. – Markos

+3

Đây phải là câu trả lời đúng –

+2

@ Markos — một biểu thức hàm có tên không còn là "ẩn danh" nữa. ;-) – RobG

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