Câu trả lời của minitech khá tốt, nhưng thiếu một kịch bản nữa. Hàm khai báo của bạn gọi là gọi lại, có nghĩa là hai thứ, đầu tiên hàm là đối tượng trong bộ nhớ, và hàm thứ hai, tên hàm chỉ để tham chiếu đến đối tượng. Nếu bạn, vì bất kỳ lý do nào phá vỡ tham chiếu giữa hai mã này, mã được đề xuất cũng sẽ không hoạt động.
Proof:
function callback() {
// ...
setTimeout(callback, 100);
}
setTimeout(callback, 100);
var callback2 = callback; //another reference to the same object
callback = null; //break the first reference
callback2(); //callback in setTimeout now is null.
Từ developer Mozilla page trong mô tả là:
Cảnh báo: 5th edition của ECMAScript (ES5) cấm sử dụng arguments.callee() trong chế độ nghiêm ngặt. Tránh sử dụng arguments.callee() bằng cách hoặc cho biểu thức hàm một tên hoặc sử dụng hàm khai báo trong đó một hàm phải tự gọi.
rõ ràng đây là ví dụ đầu tiên của workaround "bởi một trong hai chức năng đưa ra biểu thức một tên", nhưng cho phép xem làm thế nào chúng ta có thể đối phó với "hoặc sử dụng một tuyên bố chức năng mà một hàm phải gọi chính nó" và điều đó sẽ mang lại:
function callback(){
//...
setTimeout(innercall(), 100);
function innercall(){
//innercall is safe to use in callback context
innercall.caller(); //this will call callback();
}
}
Sau đó chúng ta được an toàn để làm bất cứ điều gì chúng tôi muốn có tài liệu tham khảo callback:
var callback2 = callback;
callback = null;
callback2(); //will work perfectly.
Đối với wh tại giá trị của nó: [Các biểu thức hàm được đặt tên được làm rõ] (http://kangax.github.com/nfe/). – sdleihssirhc
Có, bạn nên đặt tên cho hàm của bạn và sử dụng tên của nó trong setTimeout. – kubetz
có thể trùng lặp của [Tại sao thuộc tính arguments.callee.caller không được chấp nhận trong JavaScript?] (Http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao