Tôi có một hàm nhất định, trong số các đối số khác, hai đối số tùy chọn có thể là các hàm. Cả hai cần phải là tùy chọn, một sẽ là một hàm, và một sẽ là một boolean hoặc một hàm trả về một boolean.Kiểm tra xem hàm JavaScript có trả về mà không thực thi không?
// Obj.func(variable, String[, Object][, Boolean||Function][, Function]);
Obj.func = function(other, assorted, args, BoolOrFunc, SecondFunc) {
// execution
};
Obj.func(
[
'some',
'data'
],
'of varying types',
{
and: 'some optional arguments'
},
function() {
if(some condition) {
return true;
}
return false;
},
function() {
// do things without returning
}
);
Đó là mong muốn của tôi mà cả hai chức năng (và một số trong những lập luận khác, nếu vấn đề) là tùy chọn, có nghĩa là tôi có mã trong hàm để xác định tham số người dùng có ý định sử dụng.
Thật không may, vì cả hai có thể có chức năng và có thể được chỉ định trực tiếp trong cuộc gọi chức năng, tôi không thể sử dụng đơn giản là typeof
hoặc instanceof
điều kiện. Tuy nhiên, kể từ khi chức năng đầu tiên, nếu nó tồn tại, sẽ luôn trả về một boolean (và chức năng thứ hai sẽ không trở lại tại tất cả), một trong những ý tưởng tôi đã sẽ được kiểm tra giá trị trả về của nó:
if(typeof BoolOrFunc === 'boolean'
|| (typeof BoolOrFunc === 'function' && typeof BoolOrFunc() === 'boolean')) {
// BoolOrFunc is either a boolean or a function that returns a boolean.
// Handle it as the intended argument.
} else {
// Otherwise, assume value passed as BoolOrFunc is actually SecondFunc,
// and BoolOrFunc is undefined.
}
này hoạt động theo nguyên tắc; tuy nhiên, chạy typeof BoolOrFunc()
thực thi hàm, gây ra sự cố nếu hàm không chỉ trả về boolean: tức là, nếu hàm được chuyển thành BoolOrFunc
là thực tế là có nghĩa là SecondFunc
. SecondFunc
, trong trường hợp này, là một chức năng gọi lại và có thể thực hiện các hành động, bao gồm sửa đổi DOM, mà tôi không muốn thực thi ngay lập tức.
Vì lý do này, câu hỏi của tôi là: Có cách nào để kiểm tra xem một hàm có trả về mà không thực thi không?
Một điều tôi đã coi là để gọi BoolOrFunc.toString()
, sau đó thực hiện tìm kiếm Regular Expression cho giá trị trả về, một cái gì đó dọc theo dòng của ...
if(typeof BoolOrFunc === 'boolean'
|| (typeof BoolOrFunc === 'function'
&& BoolOrFunc.toString().search(/return (true|false);/) !== -1)) {
// BoolOrFunc is either a boolean or contains a return string with a boolean.
// Handle it as the intended argument.
}
Lưu ý rằng mã trên có thể không làm việc như viết: Tôi đã không thực sự xây dựng một trường hợp thử nghiệm cho nó, bởi vì, tốt, nó có vẻ đặc biệt không hiệu quả và có khả năng không đáng tin cậy, và tôi đã tìm một ai đó ở đây có thể có một giải pháp thanh lịch hơn cho tình trạng khó khăn của tôi. Điều đó đã được nói, tôi figured tôi muốn bao gồm nó cho các mục đích thảo luận.
Là một lưu ý giai thoại, điều này là khá gần với các vấn đề dừng (http://en.wikipedia.org/wiki/Halting_problem) mà là undecidable trên máy Turing. :) – lexicore
Heh, bạn đưa ra một điểm tốt. Tôi có thể mong đợi quá nhiều từ JS. : P – Meshaal
Đối với trường hợp người dùng gọi biểu mẫu cung cấp boolean và hàm trả về boolean, bạn có thể yêu cầu thay vào đó họ chuyển vào đối số được bao bọc trong một đối tượng, ví dụ: 'Obj.func (myvar, mystring, myobj, {boolarg: true, funcarg: my_func_that_returns_bool}); 'hoặc một cái gì đó tương tự, để làm cho nó rõ ràng nó là gì. Sau đó, người dùng phải đảm bảo rằng 'my_func_that_returns_bool' thực hiện khi xác nhận quyền sở hữu – Brandin