Bạn có phải khai báo các biến trong javascript không?

Không cần phải khai báo tất cả các vars javascript một lần ở đầu hàm và đã lâu rồi

Quay lại những ngày xưa tồi tệ của javascript, mọi người đột nhiên bắt đầu viết tất cả mã của họ như thế này

Quy tắc ở đây là

  • Chỉ một câu lệnh var cho mỗi hàm
  • Câu lệnh var đó phải ở đầu hàm

Phong cách này đã trở nên phổ biến sau JavaScript của Douglas Crockford. Các bộ phận tốt

JavaScript có cú pháp C, nhưng các khối của nó không có phạm vi. Vì vậy, quy ước rằng các biến nên được khai báo ở lần sử dụng đầu tiên thực sự là một lời khuyên tồi trong JavaScript. JavaScript có phạm vi hàm, nhưng không có phạm vi khối, vì vậy tôi khai báo tất cả các biến của mình ở đầu mỗi hàm. JavaScript cho phép các biến được khai báo sau khi chúng được sử dụng. Điều đó giống như một lỗi đối với tôi và tôi không muốn viết các chương trình trông giống như lỗi

Và cho đến ngày nay, jslint, công cụ linting của Crockford, sẽ bị lỗi theo mặc định nếu bạn không tuân theo quy tắc này

Nhưng tại sao?

Lý do là, như Crockford đề cập. JavaScript cho phép các biến được khai báo sau khi chúng được sử dụng. Được mệnh danh là “biến nâng”, điều này có khả năng tạo ra các lỗi tinh vi và nguy hiểm

Mã này xuất ra “10” một cách giả tạo, bởi vì var total có tác dụng cẩu lên và khai báo totalundefined ở đầu hàm, khiến nó không kiểm tra được tính trung thực ở dòng 8

Nhưng quy tắc của Crockford có thực sự cần thiết nữa không?

Giải pháp 1. Sử dụng let

Sử dụng ES2015/ES6, trong nút hoặc thông qua babel, chúng tôi chỉ có thể viết mã của mình để sử dụng let thay vì var, cung cấp phạm vi khối biến của chúng tôi và không kéo chúng lên

Điều này hoàn toàn tránh được vấn đề và có nghĩa là không còn động cơ nào để xác định nhiều biến cho mỗi câu lệnh let hoặc nhóm tất cả các định nghĩa biến của chúng ở đầu hàm — mặc dù vì lý do nào đó bạn vẫn thấy mọi người làm điều này, ngay cả với let

Nhưng còn javascript hiện tại của tôi, mà tôi chưa chuyển đổi sang ES2015 thì sao?

Giải pháp 2. sử dụng eslint

Eslint phát hiện các loại lỗi cẩu thả khác nhau cách xa một dặm [với cấu hình mặc định của nó], bằng cách đưa ra lỗi nếu

  • Bạn khai báo lại một biến đã được khai báo
  • Bạn cố gắng sử dụng một biến trước khi nó được khai báo

Với hai quy tắc đơn giản này, tôi thách thức bất kỳ ai phát hiện ra lỗi do cẩu biến, ngay cả khi bạn tiếp tục sử dụng var

Và nếu bạn đang sử dụng ES2015 trở lên, tôi thậm chí còn khuyên bạn nên sử dụng eslint để ngăn hoàn toàn việc sử dụng var và buộc let

Giải pháp 3. Tiếp tục sử dụng jslint [nếu bạn phải]

Ngay cả jslint cũng sẽ phàn nàn nếu bạn sử dụng một biến nằm ngoài phạm vi hoặc khai báo lại một biến từ phạm vi bên ngoài

Với điều này, đó là một bí ẩn đối với tôi tại sao jslint vẫn thực thi quy tắc var đơn theo mặc định. Ít nhất, có một tùy chọn total0 mà bạn có thể sử dụng để tắt quy tắc đó

Tóm lại là. làm ơn, làm ơn ngừng viết mã với một loạt các biến được khai báo trong một câu lệnh duy nhất ở đầu hàm của bạn. Nó khó bảo trì hơn, đọc kém rõ ràng hơn và theo tôi, nó có nhiều khả năng tạo ra lỗi hơn là ngăn chặn vấn đề mà nó đang cố gắng giải quyết. Chẳng hạn như nguy cơ vô tình tạo các biến toàn cục nếu bạn quên thêm một số biến mới vào câu lệnh var duy nhất của mình, nếu bạn chưa sử dụng một kẻ nói dối

Rõ ràng, luôn luôn sử dụng một kẻ nói dối [hãy an toàn nhé các con], bởi vì những kẻ nói dối, kể cả của Crockford, làm mất hiệu lực nhu cầu thực hiện các vars đơn lẻ và nắm bắt biến cẩu trước khi nó xảy ra. Nhưng nếu bạn không hoặc không thể, thay vì tuân theo quy ước var đơn lẻ, hãy làm theo các quy tắc này và bạn sẽ có thời gian tốt hơn nhiều

  • Không bao giờ khai báo lại một var từ phạm vi cha hoặc sử dụng cùng một tên hai lần
  • Không bao giờ tham chiếu một biến cục bộ trước khi nó được khai báo

Giờ đây, bạn có thể tìm hiểu cách phát hiện các sự cố cẩu biến trước khi chúng xảy ra, thay vì chỉ tuân theo một cách mù quáng một quy ước đơn-var khó hiểu

Một biến là một tên được liên kết với một giá trị; . Biến cho phép bạn lưu trữ và thao tác dữ liệu trong chương trình của mình. Ví dụ: dòng JavaScript sau đây gán giá trị

var sum = i + 3;
7 cho một biến có tên
var sum = i + 3;
8

i = 2;

Và dòng sau thêm

var sum = i + 3;
9 vào
var sum = i + 3;
8 và gán kết quả cho một biến mới,
i = 10;
i = "ten";
1

var sum = i + 3;

Hai dòng mã này trình bày mọi thứ bạn cần biết về các biến. Tuy nhiên, để hiểu hết cách hoạt động của biến trong JavaScript, bạn cần nắm vững thêm một số khái niệm. Thật không may, những khái niệm này đòi hỏi nhiều hơn một vài dòng mã để giải thích. Phần còn lại của chương này giải thích cách gõ, khai báo, phạm vi, nội dung và độ phân giải của biến. Nó cũng khám phá việc thu gom rác và tính đối ngẫu của biến/thuộc tính. []

Một điểm khác biệt quan trọng giữa JavaScript và các ngôn ngữ như Java và C là JavaScript không được gõ. Điều này một phần có nghĩa là biến JavaScript có thể chứa giá trị của bất kỳ kiểu dữ liệu nào, không giống như biến Java hoặc C, chỉ có thể chứa một loại dữ liệu cụ thể mà nó được khai báo. Ví dụ: trong JavaScript, việc gán một số cho một biến và sau đó gán một chuỗi cho biến đó là hoàn toàn hợp pháp

i = 10;
i = "ten";

Trong C, C++, Java hoặc bất kỳ ngôn ngữ được gõ mạnh nào khác, mã như thế này là bất hợp pháp

Một tính năng liên quan đến việc thiếu gõ JavaScript là ngôn ngữ này thuận tiện và tự động chuyển đổi các giá trị từ loại này sang loại khác, khi cần thiết. Ví dụ: nếu bạn cố nối một số vào một chuỗi, JavaScript sẽ tự động chuyển đổi số đó thành chuỗi tương ứng để có thể nối thêm. Chuyển đổi kiểu dữ liệu được trình bày chi tiết trong Chương 3

JavaScript rõ ràng là một ngôn ngữ đơn giản hơn để được untyped. Ưu điểm của các ngôn ngữ được gõ mạnh như C ++ và Java là chúng thực thi các thực hành lập trình nghiêm ngặt, giúp dễ dàng viết, bảo trì và sử dụng lại các chương trình dài, phức tạp. Vì nhiều chương trình JavaScript là các tập lệnh ngắn hơn nên sự chặt chẽ này là không cần thiết và chúng tôi được hưởng lợi từ cú pháp đơn giản hơn

Trước khi bạn sử dụng một biến trong chương trình JavaScript, bạn phải khai báo nó. [] Các biến được khai báo với từ khóa

i = 10;
i = "ten";
2, như thế này

var i;
var sum;

Bạn cũng có thể khai báo nhiều biến với cùng một từ khóa

i = 10;
i = "ten";
2

var i, sum;

Và bạn có thể kết hợp khai báo biến với khởi tạo biến

var message = "hello";
var i = 0, j = 0, k = 0;

Nếu bạn không chỉ định giá trị ban đầu cho một biến bằng câu lệnh

i = 10;
i = "ten";
2, thì biến đó được khai báo, nhưng giá trị ban đầu của nó là
i = 10;
i = "ten";
5 cho đến khi mã của bạn lưu giá trị vào đó

Lưu ý rằng câu lệnh

i = 10;
i = "ten";
2 cũng có thể xuất hiện như một phần của vòng lặp
i = 10;
i = "ten";
7 và
i = 10;
i = "ten";
8 [được giới thiệu trong Chương 6], cho phép bạn khai báo ngắn gọn biến vòng lặp như một phần của chính cú pháp vòng lặp. Ví dụ

for[var i = 0; i < 10; i++] document.write[i, ">brbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbr

Chủ Đề