2016-07-18 16 views
13

Tôi cần tên hàm hiện tại làm chuỗi để đăng nhập vào cơ sở nhật ký của chúng tôi. Nhưng arguments.callee.name chỉ hoạt động ở chế độ lỏng lẻo. Cách lấy tên hàm dưới "use strict"?Nhận tên hàm hiện tại ở chế độ nghiêm ngặt

+2

Nếu bạn có thể thay đổi cơ thể của chức năng để thêm mã khai thác gỗ, bạn không thể chỉ cần mã hóa cứng tên hàm? Bạn sẽ có lợi thế gì nếu bạn có thể đọc nó từ một tài sản? – nnnnnn

+4

@nnnnnn ai đó giữ chức năng đổi tên nhưng quên cập nhật dòng nhật ký. – exebook

Trả lời

18

Đối với mục đích khai thác gỗ/gỡ lỗi, bạn có thể tạo một đối tượng mới Error trong logger và kiểm tra tài sản .stack của nó, ví dụ

function logIt(message) { 
 
    var stack = new Error().stack, 
 
     caller = stack.split('\n')[2].trim(); 
 
    console.log(caller + ":" + message); 
 
} 
 

 
function a(b) { 
 
    b() 
 
} 
 

 
a(function xyz() { 
 
    logIt('hello'); 
 
});

+0

Câu trả lời của bạn hơi phức tạp một chút, nhưng nó cho thấy ý tưởng. – exebook

+0

Một câu trả lời tuyệt vời @georg. Lưu ý rằng '' [2] '' chỉ liên quan đến ví dụ này, nếu bạn có ví dụ một ngăn chứa ba hàm cha trong trường hợp này, chúng ta phải thay đổi ** 2 ** thành ** 3 ** – Ismail

+3

@hamism: 'stack [2] 'luôn luôn là hàm gọi là logger, cho dù stack có sâu đến mức nào. – georg

0

Sau ít nghiên cứu ở đây là một giải pháp tốt:

function getFnName(fn) { 
    var f = typeof fn == 'function'; 
    var s = f && ((fn.name && ['', fn.name]) || fn.toString().match(/function ([^\(]+)/)); 
    return (!f && 'not a function') || (s && s[1] || 'anonymous'); 
} 



function test(){ 
    console.log(getFnName(this)); 
} 

test = test.bind(test); 

test(); // 'test' 

Nguồn: https://gist.github.com/dfkaye/6384439

+2

Nhưng điều đó không hoạt động từ bên trong hàm trừ khi bạn đã có tham chiếu đến hàm. OP yêu cầu thay thế cho 'arguments.callee.name' ... – nnnnnn

1

Bạn có thể ràng buộc chức năng như bối cảnh của nó sau đó bạn có thể truy cập vào tên của nó qua this.name tài sản:

function x(){ 
    console.log(this.name); 
} 
x.bind(x)(); 
Các vấn đề liên quan