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
Trả lời
Đố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');
});
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
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
@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
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'
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
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)();
- 1. Chương trình dòng lệnh Hacklang ở chế độ nghiêm ngặt
- 2. PHPUnit - Tại sao PHPUnit xuất hiện để chạy ở chế độ nghiêm ngặt?
- 3. Biến toàn cầu ở chế độ nghiêm ngặt JavaScript
- 4. Tắt chế độ nghiêm ngặt của MySQL
- 5. Cách nhận người gọi từ chế độ nghiêm ngặt?
- 6. Dấu/lề bí ẩn xuất hiện sau khi hình ảnh ở chế độ nghiêm ngặt
- 7. Cách ghi đè hàm.length để trả về độ dài của mảng, ở chế độ nghiêm ngặt
- 8. Chế độ nghiêm ngặt: Thay thế cho arguments.callee.length?
- 9. Chế độ nghiêm ngặt có cấm khai báo hàm mức tuyên bố không?
- 10. vi phạm chế độ nghiêm ngặt liệt kê
- 11. Buộc chế độ sql nghiêm ngặt trong django
- 12. Chế độ nghiêm ngặt của PHPUnit làm gì?
- 13. Nhận tham chiếu đến đối tượng toàn cục trong một môi trường không xác định ở chế độ nghiêm ngặt
- 14. Sử dụng không mong muốn từ dành riêng 'let' ở chế độ nghiêm ngặt
- 15. Tại sao xóa không được cho phép trong chế độ nghiêm ngặt Javascript5?
- 16. Chế độ nghiêm ngặt ("sử dụng nghiêm ngặt";) được thừa hưởng bởi các chức năng như thế nào?
- 17. Function.prototype.call thay đổi typeof này, bên ngoài chế độ nghiêm ngặt; tại sao?
- 18. Phần mã khung sử dụng nghiêm ngặt/không nghiêm ngặt?
- 19. Làm cách nào để tắt cảnh báo về 'chế độ này' và chế độ nghiêm ngặt bằng JSHint?
- 20. Không thể kiểm tra biến phạm vi khi sử dụng chế độ nghiêm ngặt
- 21. "chế độ nghiêm ngặt" là gì và được sử dụng như thế nào?
- 22. Visual Studio Task Runner "Cú pháp: Sử dụng const trong chế độ nghiêm ngặt."
- 23. Động cơ đằng sau lỗi cú pháp chế độ nghiêm ngặt khi xóa số nhận dạng không đủ tiêu chuẩn?
- 24. Bất kỳ cách nào để buộc chế độ nghiêm ngặt trong nút?
- 25. thế nào để tránh "literals Octal không được phép vào chế độ nghiêm ngặt" với createWriteStream
- 26. JavaScript: xác định một hằng số bên trong try/catch với chế độ nghiêm ngặt
- 27. Dự án Angular-CLI mặc định Không có trong Safari - chế độ nghiêm ngặt thủ phạm?
- 28. nút 0.12.x const trong vấn đề chế độ nghiêm ngặt
- 29. PHPUnit chế độ nghiêm ngặt - cách thay đổi thời gian chờ mặc định
- 30. Nghiêm ngặt hoặc Chuyển tiếp?
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
@nnnnnn ai đó giữ chức năng đổi tên nhưng quên cập nhật dòng nhật ký. – exebook