2011-11-21 50 views
8

Tôi có một chức năng trong JS được gọi từ nhiều nơi ..Javascript tìm chức năng gọi

Bây giờ tôi đang thử trang này trên iPad và do đó tìm gỡ lỗi một chút.

Tôi có thể tìm hiểu bằng cách nào đó (in trên bảng điều khiển) từ nơi chức năng của tôi được gọi đến không?

+2

Điều này sẽ giúp: http://stackoverflow.com/questions/280389/how-do-you-find-out-the-caller-function-in-javascript – Sid

+0

Một liên kết khác http://stackoverflow.com/questions/147891/javascript-exception-stack-trace –

Trả lời

13

Như thế này?

function testOne() { 
    console.log("Test 1"); 
    logTest(); 
} 
function testTwo() { 
    console.log("Test 2"); 
    logTest(); 
} 
function logTest() { 
    console.log("Being called from " + arguments.callee.caller.toString()); 
} 

testOne(); 
testTwo(); 

Nếu bạn sử dụng 'use strict'; trong tập tin JavaScript của bạn, bạn cần phải bình luận/gỡ bỏ nó, bởi vì nếu không bạn sẽ nhận được một cái gì đó như thế này:

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

+3

Tôi đang gặp lỗi hoặc .... Kết quả của các đối số biểu thức.callee.caller không phải là một đối tượng – testndtv

+0

Tôi đang kiểm tra điều này trên iPad Safari..if điều đó tạo nên sự khác biệt ... – testndtv

+0

@James, +1, Chức năng của bạn đã tiết kiệm thời gian để hiểu khuôn khổ hiện tại và hoàn thành công việc của tôi. Cảm ơn nhiều!!! –

9

Một cách đơn giản, tôi muốn sử dụng là arguments.callee.caller.name .

Giả sử bạn muốn biết chuyện gì đang kêu gọi một chức năng gọi là myFunction:

function myFunction() { 
    console.log(arguments.callee.caller.name); 
    /* Other stuff... */ 
} 

Các trình duyệt hỗ trợ cho điều này là không phải là rất lớn, tuy nhiên, do đó bạn có thể sử dụng arguments.callee.caller.toString() thay thế. Lưu ý rằng điều này sẽ cho bạn trở lại nội dung của hàm được gọi là myFunction, vì vậy bạn sẽ cần phải tự mình khai thác tên hàm.

Hoặc, bạn có thể sử dụng một đẹp stack trace chức năng như thế này:

function getStack(){ 
    fnRE = /function\s*([\w\-$]+)?\s*\(/i; 
    var caller = arguments.callee.caller; 
    var stack = "Stack = "; 
    var fn; 
    while (caller){ 
     fn = fnRE.test(caller.toString()) ? RegExp.$1 || "{?}" : "{?}"; 
     stack += "-->"+fn; 
     caller = caller.arguments.callee.caller; 
    }; 
    return stack; 
} 

Stack Trace qua http://www.amirharel.com/2010/01/25/using-caller-and-callee-for-stack-trace/

0

Muốn chi tiết về người gọi Chức năng:

function nishant(){ // Caller function 
    kumar(); 
}nishant(); 

function kumar(){ // Callee 
console.log("This functiona is being called by " + arguments.callee.caller.toString()); 
} 

Ở vị trí của arguments.callee.caller.toString() chúng tôi cũng có thể sử dụng functionName.caller

Ví dụ:

function nishant(){ // Caller function 
    kumar(); 
}nishant(); 

function kumar(){ // Callee 
console.log("This functiona is being called by " + kumar.caller); 
} 

Output: sẽ như nhau trong cả hai trường hợp trên

This functiona is being called by function nishant() 
{ 
kumar(); 
} 
+0

* functionName.caller * là một cái đẹp, nhưng [không chuẩn] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller) (theo MDN) – mTorres

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