Tại sao một cái gì đó không phải là một chức năng JavaScript?

Lúc đầu, JavaScript có vẻ khá đơn giản. Tuy nhiên, ngôn ngữ này có nhiều sắc thái, mạnh mẽ và phức tạp hơn đáng kể so với những gì người ta tin tưởng ban đầu. Nhiều điểm phức tạp của JavaScript dẫn đến một số vấn đề phổ biến—10 vấn đề trong số đó chúng tôi thảo luận ở đây—khiến mã không hoạt động như dự kiến. Điều quan trọng là phải nhận thức được và tránh những cạm bẫy này trong hành trình trở thành nhà phát triển JavaScript bậc thầy

Chia sẻ

Chia sẻ

Tại sao một cái gì đó không phải là một chức năng JavaScript?

Lúc đầu, JavaScript có vẻ khá đơn giản. Tuy nhiên, ngôn ngữ này có nhiều sắc thái, mạnh mẽ và phức tạp hơn đáng kể so với những gì người ta tin tưởng ban đầu. Nhiều điểm phức tạp của JavaScript dẫn đến một số vấn đề phổ biến—10 vấn đề trong số đó chúng tôi thảo luận ở đây—khiến mã không hoạt động như dự kiến. Điều quan trọng là phải nhận thức được và tránh những cạm bẫy này trong hành trình trở thành nhà phát triển JavaScript bậc thầy

Tại sao một cái gì đó không phải là một chức năng JavaScript?

Bởi Ryan J. Peterson

Chuyên gia đã được xác minh  về Kỹ thuật

Ryan là một kiến ​​trúc sư, doanh nhân và nhà phát triển. Anh ấy có kỹ năng xây dựng các hệ thống phần mềm có thể mở rộng, có thể mở rộng trên đám mây

Tuy nhiên, đôi khi chúng ta phải chú ý. Đặc biệt, trong nút. js, chúng tôi sử dụng require() để tải các tệp và mô-đun bên ngoài

Trong một số trường hợp, điều này có thể gây ra lỗi như thế này

TypeError: require(...) is not a function

Đó là một lỗi kỳ lạ, phải không?

Hãy xem làm thế nào tôi có được nó

Tôi yêu cầu một thư viện và sau đó tôi phải chạy một số mã ở cấp cơ sở và tôi đã tạo một hàm async được gọi ngay lập tức

const fs = require('fs')

(async () => {
  //...
})()

JS không nhìn thấy dấu chấm phẩy sau yêu cầu () và chúng tôi bắt đầu một dòng bằng ( và JS nghĩ rằng chúng tôi đang cố thực thi một chức năng

Nó coi require('fs') là tên của hàm, đây là thứ thực sự có thể hoạt động nếu xuất mô-đun trả về một hàm

Nhưng không phải vậy, vì vậy chúng tôi nhận được lỗi ...is not a function đó

Làm thế nào để chúng tôi sửa chữa nó?

Chúng ta phải thêm dấu chấm phẩy. Một vài nơi

Điều này sẽ làm việc

const fs = require('fs')

;(async () => {
  //...
})()

và điều này cũng sẽ làm việc

const fs = require('fs');

(async () => {
  //...
})()

Đó là một cái giá nhỏ mà chúng ta phải trả để tránh sử dụng dấu chấm phẩy ở mọi nơi

Mẹo. chờ đợi cấp cao nhất bây giờ là một thứ, bạn có thể sử dụng cấu trúc đó thay vì cấu trúc này và nó sẽ ngăn các lỗi như vậy

Ngoại lệ JavaScript "không phải là một hàm" xảy ra khi có nỗ lực gọi một giá trị từ một hàm, nhưng giá trị đó không thực sự là một hàm

Tin nhắn

TypeError: Object doesn't support property or method {x} (Edge)
TypeError: "x" is not a function

loại lỗi

let x = document.getElementByID('foo');
// TypeError: document.getElementByID is not a function
1

Có chuyện gì?

Nó đã cố gọi một giá trị từ một hàm, nhưng giá trị đó không thực sự là một hàm. Một số đoạn mã mong bạn cung cấp một chức năng, nhưng điều đó đã không xảy ra

Có lẽ có một lỗi đánh máy trong tên chức năng?

Có nhiều chức năng tích hợp cần chức năng (gọi lại). Bạn sẽ phải cung cấp một hàm để các phương thức này hoạt động bình thường

  • Khi làm việc với các đối tượng
    let x = document.getElementByID('foo');
    // TypeError: document.getElementByID is not a function
    
    4 hoặc
    let x = document.getElementByID('foo');
    // TypeError: document.getElementByID is not a function
    
    6
    • _______5_______7, _______5_______8, _______5_______9, _______14_______0, _______14_______1, _______14_______2, _______14_______3, _______14_______4
  • Khi làm việc với các đối tượng
    let x = document.getElementById('foo');
    
    5 và
    let x = document.getElementById('foo');
    
    6
    • let x = document.getElementById('foo');
      
      7 và
      let x = document.getElementById('foo');
      
      8

ví dụ

Một lỗi đánh máy trong tên chức năng

Trong trường hợp này, điều xảy ra quá thường xuyên, có một lỗi đánh máy trong tên phương thức

let x = document.getElementByID('foo');
// TypeError: document.getElementByID is not a function

Tên hàm chính xác là

let x = document.getElementById('foo');
9

let x = document.getElementById('foo');

Chức năng được gọi trên đối tượng sai

Đối với một số phương pháp nhất định, bạn phải cung cấp chức năng (gọi lại) và chức năng này sẽ chỉ hoạt động trên các đối tượng cụ thể. Trong ví dụ này,

let x = document.getElementById('foo');
0 được sử dụng, sẽ chỉ hoạt động với các đối tượng
let x = document.getElementByID('foo');
// TypeError: document.getElementByID is not a function
4

let obj = {a: 13, b: 37, c: 42};

obj.map(function(num) {
  return num * 2;
});

// TypeError: obj.map is not a function

Sử dụng một mảng thay thế

let numbers = [1, 4, 9];

numbers.map(function(num) {
  return num * 2;
});

// Array [2, 8, 18]

Hàm chia sẻ tên với thuộc tính có sẵn

Đôi khi khi tạo một lớp, bạn có thể có một thuộc tính và một hàm trùng tên. Khi gọi hàm, trình biên dịch nghĩ rằng hàm không còn tồn tại

Nó có nghĩa là gì khi một cái gì đó không phải là một chức năng?

Ngoại lệ JavaScript "không phải là một hàm" xảy ra khi có nỗ lực gọi một giá trị từ một hàm, nhưng giá trị đó không thực sự là một hàm.

Mọi thứ trong JavaScript có phải là một chức năng không?

Trong JavaScript, mọi thứ đều là một đối tượng, ngay cả khi nó là một thứ khác. Hàm là đối tượng . Chuỗi là đối tượng.

Tại sao nó không được xác định khi tôi gọi hàm JavaScript?

Một biến chưa được gán giá trị là kiểu không xác định. Một phương thức hoặc câu lệnh cũng trả về không xác định nếu biến đang được đánh giá không có giá trị được gán. Hàm trả về giá trị không xác định nếu giá trị không được trả về .

Điều đó có nghĩa là gì không xác định không phải là một chức năng?

Đây là một lỗi JavaScript phổ biến xảy ra khi bạn cố gắng gọi một hàm trước khi nó được xác định. Bạn gặp lỗi này khi cố gắng thực thi một chức năng chưa được khởi tạo hoặc khởi tạo không đúng cách. Điều đó có nghĩa là biểu thức không trả về đối tượng hàm .