Hướng dẫn how do you check whether a variable is a function javascript? - làm cách nào để kiểm tra xem một biến có phải là một hàm javascript không?

Đối với những người quan tâm đến phong cách chức năng hoặc tìm kiếm cách tiếp cận biểu cảm hơn để sử dụng trong lập trình meta (chẳng hạn như kiểm tra loại), có thể rất thú vị khi thấy thư viện Ramda để hoàn thành nhiệm vụ đó.

Mã tiếp theo chỉ chứa các hàm thuần túy và pointfree:

const R = require('ramda');

const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);

const equalsSyncFunction = isPrototypeEquals(() => {});

const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);

Kể từ ES2017, các chức năng

const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
1 có sẵn, vì vậy chúng tôi cũng có thể kiểm tra chúng:

const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);

Và sau đó kết hợp chúng với nhau:

const isFunction = R.either(isSyncFunction, isAsyncFunction);

Tất nhiên, chức năng nên được bảo vệ chống lại các giá trị

const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
2 và
const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
3, vì vậy để làm cho nó "an toàn":

const safeIsFunction = R.unless(R.isNil, isFunction);

Và, hoàn thành đoạn trích để tổng hợp:

const R = require('ramda');

const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);

const equalsSyncFunction = isPrototypeEquals(() => {});
const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);

const isFunction = R.either(isSyncFunction, isAsyncFunction);

const safeIsFunction = R.unless(R.isNil, isFunction);

// ---

console.log(safeIsFunction( function () {} ));
console.log(safeIsFunction( () => {} ));
console.log(safeIsFunction( (async () => {}) ));
console.log(safeIsFunction( new class {} ));
console.log(safeIsFunction( {} ));
console.log(safeIsFunction( [] ));
console.log(safeIsFunction( 'a' ));
console.log(safeIsFunction( 1 ));
console.log(safeIsFunction( null ));
console.log(safeIsFunction( undefined ));

Tuy nhiên, lưu ý giải pháp này có thể hiển thị ít hiệu suất hơn các tùy chọn có sẵn khác do sử dụng rộng rãi các chức năng bậc cao.

Hàm JavaScript là một khối mã được thiết kế để thực hiện một nhiệm vụ cụ thể. Nó được thực hiện khi nó được gọi (khi một cái gì đó gọi nó). Một chức năng có thể là một chức năng có tên hoặc một ẩn danh. Bài viết này nói về cách kiểm tra xem một biến có thuộc loại 'chức năng' hay không. Trước khi chúng tôi hiểu các phương pháp khác nhau để thực hiện điều này và tại sao bất cứ ai cũng muốn gán một hàm cho một biến, hãy xem xét cách các hàm được đặt tên và ẩn danh được khai báo.

Mục lục

  • Các loại khai báo chức năng
  • Lợi thế của việc gán một hàm cho một biến
  • Mã số
  • Hãy cẩn thận

Các loại khai báo chức năng

Lợi thế của việc gán một hàm cho một biến

Mã số

function functionName(parameter1, paramter2) { //code}

Được đặt tên là khai báo chức năng

Hàm này có một định danh được đặt tên được liên kết với nó có thể được sử dụng để gọi hàm

var anon = function() { //code }

Lợi thế của việc gán một hàm cho một biến

Mã số

myButton.onclick = function() {
    //response actions
}

Mã số

Sử dụng toán tử InstanceOf

Toán tử InstanceOf được sử dụng để kiểm tra loại đối tượng tại thời điểm chạy. Toán tử này trả về một giá trị boolean (đúng hoặc sai). Trong ví dụ dưới đây, câu lệnh IF được sử dụng để kiểm tra xem loại tham số được truyền cho CheckFunction () có thuộc loại chức năng hay không.

//javascript check if function-Using instanceof operator
<
script >

    // Declare a variable and initialize it // Declare a variable and initialize it with an anonymous function
    var exampleVar = function() {
        /* A set of statements */ };

// to check a variable is of function type or not
function checkFunction(x) {

    if (x instanceof Function) {
        document.write("Variable is of function type");
    } else {
        document.write("Variable is not of function type");
    }
}

// Function call
checkFunction(exampleVar);

<
/script>

Sử dụng so sánh bình đẳng nghiêm ngặt (===) cùng với toán tử loại

Trong JavaScript, toán tử so sánh bình đẳng nghiêm ngặt (===) được sử dụng để kiểm tra xem hai thực thể không chỉ có giá trị bằng nhau mà còn loại bằng nhau. Toán tử typeOf trả về một chuỗi cho biết loại của toán hạng không được đánh giá. Cả hai nhà khai thác này cung cấp một kết quả boolean. Kết quả này có thể được so sánh bằng cách sử dụng câu lệnh IF để kiểm tra xem loại đối tượng có phải là "hàm 'không.

//javascript check if function-Using Strict Equality comparison (===) along with typeof operator

Sử dụng object.prototype.toString

Phương pháp này sử dụng object.prototype.toString. Mỗi đối tượng đều có một phương thức toString (), trả về ‘[loại đối tượng], trong đó‘ loại là loại đối tượng. Một câu lệnh IF có thể được sử dụng để so sánh nếu giá trị trả về là loại 'hàm'.

const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
0

Hãy cẩn thận

Trong loại chrome (obj) === 'hàm' dường như là nhanh nhất; Tuy nhiên, trong chức năng InstanceOf của Firefox OBJ được thực hiện tương đối tốt hơn.