Hướng dẫn how to know which function is calling javascript - làm thế nào để biết hàm nào đang gọi javascript

Lưu ý rằng giải pháp này không còn được sử dụng và không còn được sử dụng theo tài liệu MDN

//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

function Hello[]
{
    alert["caller is " + Hello.caller];
}

Lưu ý rằng tính năng này là không chuẩn, từ

arguments.callee.caller.name
5:non-standard, from
arguments.callee.caller.name
5:

Không chuẩn tính năng này là không chuẩn và không nằm trên đường tiêu chuẩn. Không sử dụng nó trên các trang web sản xuất đối mặt với web: nó sẽ không hoạt động cho mọi người dùng. Cũng có thể có sự không tương thích lớn giữa việc triển khai và hành vi có thể thay đổi trong tương lai.
This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

Sau đây là câu trả lời cũ từ năm 2008, không còn được hỗ trợ trong JavaScript hiện đại:

function Hello[]
{
    alert["caller is " + arguments.callee.caller.toString[]];
}

XOR

4.5122 Huy hiệu vàng24 Huy hiệu bạc39 Huy hiệu đồng2 gold badges24 silver badges39 bronze badges

Đã trả lời ngày 11 tháng 11 năm 2008 lúc 9:07Nov 11, 2008 at 9:07

Greg Hewgillgreg HewgillGreg Hewgill

912K178 Huy hiệu vàng1132 Huy hiệu bạc1267 Huy hiệu đồng178 gold badges1132 silver badges1267 bronze badges

21

Stacktrace

Bạn có thể tìm thấy toàn bộ dấu vết ngăn xếp bằng mã cụ thể của trình duyệt. Điều tốt là ai đó đã làm nó; Đây là mã dự án trên GitHub.

Nhưng không phải tất cả các tin tức đều tốt:

  1. Nó thực sự chậm để có được dấu vết ngăn xếp, vì vậy hãy cẩn thận [đọc nó để biết thêm].

  2. Bạn sẽ cần xác định tên chức năng cho dấu vết ngăn xếp để dễ đọc. Bởi vì nếu bạn có mã như thế này:

    var Klass = function kls[] {
       this.Hello = function[] { alert[printStackTrace[].join['\n\n']]; };
    }
    new Klass[].Hello[];
    

    Google Chrome sẽ cảnh báo

    arguments.callee.caller.name
    
    6 nhưng hầu hết các trình duyệt sẽ mong đợi một tên hàm ngay sau từ khóa
    arguments.callee.caller.name
    
    7 và sẽ coi nó như một hàm ẩn danh. Thậm chí không có thể sử dụng tên
    arguments.callee.caller.name
    
    8 nếu bạn không đặt tên
    arguments.callee.caller.name
    
    9 cho hàm.

    Và nhân tiện, bạn có thể chuyển đến chức năng PrintStackTrace tùy chọn

    arguments.callee.caller.toString[];
    
    0 nhưng tôi không tìm thấy bất kỳ cải tiến thực sự nào bằng cách làm điều đó.

  3. Không phải tất cả các trình duyệt cung cấp cho bạn cùng một thông tin. Nghĩa là, tham số, cột mã, v.v.

Tên chức năng người gọi

Nhân tiện, nếu bạn chỉ muốn tên của hàm người gọi [trong hầu hết các trình duyệt, nhưng không phải IE], bạn có thể sử dụng:

arguments.callee.caller.name

Nhưng lưu ý rằng tên này sẽ là tên sau từ khóa

arguments.callee.caller.name
7. Tôi không tìm thấy cách nào [ngay cả trên Google Chrome] để nhận được nhiều hơn thế mà không cần lấy mã của toàn bộ chức năng.

Mã chức năng người gọi

Và tóm tắt phần còn lại của các câu trả lời hay nhất [của Pablo Cabrera, Nourdine và Greg Hewgill]. Trình duyệt chéo duy nhất và điều thực sự an toàn mà bạn có thể sử dụng là:The only cross-browser and really safe thing you can use is:

arguments.callee.caller.toString[];

Sẽ hiển thị mã của hàm người gọi. Đáng buồn thay, điều đó là không đủ cho tôi, và đó là lý do tại sao tôi cung cấp cho bạn các mẹo cho StackTrace và tên hàm của người gọi [mặc dù chúng không phải là trình duyệt chéo].code of the caller function. Sadly, that is not enough for me, and that is why I give you tips for the StackTrace and the caller function Name [although they are not cross-browser].

người đập phá cách

20K12 Huy hiệu vàng99 Huy hiệu bạc133 Huy hiệu Đồng12 gold badges99 silver badges133 bronze badges

Đã trả lời ngày 24 tháng 9 năm 2010 lúc 16:38Sep 24, 2010 at 16:38

Mariano Desanzemariano DesanzeMariano Desanze

7.6597 Huy hiệu vàng45 Huy hiệu bạc67 Huy hiệu Đồng7 gold badges45 silver badges67 bronze badges

2

Tôi thường sử dụng

arguments.callee.caller.toString[];
2 trong chrome. Điều tốt đẹp là điều này cũng cung cấp cho bạn các số dòng trong đó người gọi gọi là hàm. Nhược điểm là nó giới hạn độ dài của ngăn xếp ở mức 10, đó là lý do tại sao tôi đến trang này ngay từ đầu.

.

Abarisone

3.63911 Huy hiệu vàng30 Huy hiệu bạc52 Huy hiệu Đồng11 gold badges30 silver badges52 bronze badges

Đã trả lời ngày 7 tháng 5 năm 2015 lúc 14:15May 7, 2015 at 14:15

Heystewartheystewartheystewart

8316 Huy hiệu bạc2 Huy hiệu đồng6 silver badges2 bronze badges

7

Tôi biết bạn đã đề cập đến "trong JavaScript", nhưng nếu mục đích gỡ lỗi, tôi nghĩ việc sử dụng các công cụ nhà phát triển của trình duyệt sẽ dễ dàng hơn. Đây là cách nó trông trong Chrome: chỉ cần thả trình gỡ lỗi nơi bạn muốn điều tra ngăn xếp.

Just drop the debugger where you want to investigate the stack.

Đã trả lời ngày 3 tháng 2 năm 2015 lúc 0:28Feb 3, 2015 at 0:28

PhilPhilPhil

2.62218 Huy hiệu bạc20 Huy hiệu đồng18 silver badges20 bronze badges

1

Nếu bạn sẽ không chạy nó trong IE

Bài Viết Liên Quan

Chủ Đề