Var trong javascript đã lỗi thời chưa?
ES6 đi kèm với rất nhiều tính năng mới tuyệt vời bao gồm hai cách mới để xác định các biến trong JavaScript. Hiện tại có ba từ khóa hoặc mã định danh khác nhau để khai báo một biến trong JavaScript. Trong bài viết này, tôi sẽ giải thích sự khác biệt chính giữa var, let và const và khi nào bạn nên sử dụng chúng Để hiểu đầy đủ sự khác biệt giữa từng mã định danh, trước tiên chúng ta cần hiểu khái niệm về phạm vi Phạm vi là gì?Phạm vi xác định khả năng truy cập hoặc khả năng hiển thị của các biến đối với JavaScript. Có ba loại phạm vi trong JavaScript 1. Phạm vi toàn cầu 2. Phạm vi chức năng (cục bộ) 3. Phạm vi chặn (mới với ES6) Các biến được khai báo bên ngoài một hàm nằm trong phạm vi toàn cầu. Các biến toàn cục có thể được truy cập và thay đổi trong bất kỳ phạm vi nào khác. Các biến được xác định trong một hàm thuộc phạm vi cục bộ và không thể truy cập được trong các hàm khác. Mỗi chức năng khi được gọi sẽ tạo ra một phạm vi mới, do đó các biến có cùng tên có thể được sử dụng trong các chức năng khác nhau Phạm vi khối bao gồm các câu lệnh và vòng lặp if hoặc bất kỳ mã nào khác được gói trong {}. Khi được gọi, chúng không tạo phạm vi mới. Các biến được khai báo bên trong phạm vi khối sẽ vẫn ở trong phạm vi mà chúng đã có Từ khóa VarTrước ES6, từ khóa var được sử dụng để khai báo một biến trong JavaScript. Từ khóa var đã xuất hiện kể từ khi JavaScript ra đời và đó là thứ bạn sẽ thấy trong bất kỳ mã ES6 nào trước đây Các biến được khai báo bằng từ khóa var có phạm vi toàn cầu hoặc chức năng, chúng không hỗ trợ phạm vi cấp khối. Điều này có nghĩa là nếu một biến được định nghĩa trong vòng lặp hoặc trong câu lệnh if thì nó có thể được truy cập bên ngoài khối và vô tình được định nghĩa lại dẫn đến chương trình có lỗi. Về nguyên tắc chung, bạn nên luôn khai báo biến với const, nếu bạn nhận thấy giá trị của biến cần thay đổi, hãy quay lại và thay đổi thành let Khai báo 8 tương tự như 6. Hầu hết thời gian chúng ta có thể thay thế 6 bằng 8 hoặc ngược lại và mong mọi thứ hoạt động
Nhưng bên trong 8 là một con quái vật rất khác, có nguồn gốc từ rất xa xưa. Nó thường không được sử dụng trong các kịch bản hiện đại, nhưng vẫn ẩn nấp trong các kịch bản cũNếu bạn không có kế hoạch gặp những kịch bản như vậy, bạn thậm chí có thể bỏ qua chương này hoặc hoãn lại Mặt khác, điều quan trọng là phải hiểu sự khác biệt khi di chuyển các tập lệnh cũ từ 8 sang 6, để tránh các lỗi lạCác biến, được khai báo bằng 8, thuộc phạm vi chức năng hoặc phạm vi toàn cầu. Chúng có thể nhìn thấy thông qua các khốiVí dụ
Khi 8 bỏ qua các khối mã, chúng ta có một biến toàn cục 18Nếu chúng ta sử dụng 19 thay vì 30, thì biến sẽ chỉ hiển thị bên trong 31 1Điều tương tự cho các vòng lặp. 8 không thể là khối hoặc vòng lặp cục bộ 3Nếu một khối mã nằm trong một hàm, thì 8 sẽ trở thành một biến cấp hàm 9Như chúng ta có thể thấy, 8 xuyên qua 31, 36 hoặc các khối mã khác. Đó là bởi vì cách đây rất lâu trong JavaScript, các khối không có Môi trường từ vựng và 8 là phần còn lại của điều đóNếu chúng ta khai báo cùng một biến với 6 hai lần trong cùng một phạm vi, thì đó là một lỗi 5Với 8, chúng ta có thể khai báo lại một biến nhiều lần. Nếu chúng ta sử dụng 8 với một biến đã được khai báo, nó sẽ bị bỏ qua 8Khai báo 8 được xử lý khi chức năng bắt đầu (hoặc tập lệnh bắt đầu cho toàn cục)Nói cách khác, các biến 8 được định nghĩa ngay từ đầu hàm, bất kể định nghĩa ở đâu (giả sử rằng định nghĩa không có trong hàm lồng nhau)Vì vậy, mã này 1…Về mặt kỹ thuật giống như thế này (đã di chuyển 93 ở trên) 3…Hoặc thậm chí như thế này (hãy nhớ rằng, các khối mã bị bỏ qua) 4Người ta còn gọi hành vi đó là “hoisting” (nâng cao), bởi vì tất cả 8 đều được “hoisted” (nâng) lên trên cùng của hàmVì vậy, trong ví dụ trên, nhánh 95 không bao giờ thực thi, nhưng điều đó không thành vấn đề. 8 bên trong nó được xử lý khi bắt đầu hàm, vì vậy tại thời điểm 97 biến tồn tạiCác tuyên bố được nâng lên, nhưng các bài tập thì không Điều đó được thể hiện rõ nhất bằng một ví dụ 0Dòng 98 có hai hành động trong đó
Khai báo được xử lý khi bắt đầu thực thi hàm (“hoisted”), nhưng phép gán luôn hoạt động tại nơi nó xuất hiện. Vì vậy, mã hoạt động cơ bản như thế này 1Bởi vì tất cả các khai báo của 8 đều được xử lý khi bắt đầu hàm, nên chúng ta có thể tham chiếu chúng ở bất kỳ đâu. Nhưng các biến không được xác định cho đến khi các bài tậpTrong cả hai ví dụ trên, 52 chạy không có lỗi, vì biến 53 tồn tại. Nhưng giá trị của nó chưa được gán, vì vậy nó hiển thị 54Trước đây, vì chỉ có 8 và nó không có khả năng hiển thị ở cấp độ khối nên các lập trình viên đã phát minh ra một cách để mô phỏng nó. Những gì họ đã làm được gọi là "biểu thức hàm được gọi ngay lập tức" (viết tắt là IIFE)Đó không phải là thứ chúng ta nên sử dụng ngày nay, nhưng bạn có thể tìm thấy chúng trong các tập lệnh cũ Một IIFE trông như thế này 2Tại đây, một Biểu thức hàm được tạo và được gọi ngay lập tức. Vì vậy, mã thực thi ngay lập tức và có các biến riêng của nó Biểu thức hàm được bao bọc bởi dấu ngoặc đơn 56, bởi vì khi công cụ JavaScript gặp 57 trong mã chính, nó sẽ hiểu đó là phần đầu của Tuyên bố hàm. Nhưng một Khai báo hàm phải có tên, vì vậy loại mã này sẽ báo lỗi 3Ngay cả khi chúng ta nói. "Được rồi, hãy thêm một cái tên", điều đó sẽ không hoạt động, vì JavaScript không cho phép gọi Khai báo hàm ngay lập tức 4Vì vậy, dấu ngoặc đơn xung quanh hàm là một thủ thuật để cho JavaScript thấy rằng hàm được tạo trong ngữ cảnh của một biểu thức khác và do đó, nó là Biểu thức hàm. nó không cần tên và có thể được gọi ngay lập tức Có tồn tại những cách khác ngoài dấu ngoặc đơn để nói với JavaScript rằng chúng tôi muốn nói đến Biểu thức hàm 5Trong tất cả các trường hợp trên chúng ta khai báo một Biểu thức hàm và chạy nó ngay lập tức. Hãy lưu ý lại. ngày nay không có lý do gì để viết mã như vậy Có hai điểm khác biệt chính của 8 so với 59
Có một sự khác biệt rất nhỏ nữa liên quan đến đối tượng toàn cầu, mà chúng ta sẽ đề cập trong chương tiếp theo Những khác biệt này làm cho 8 tệ hơn 6 hầu hết thời gian. Các biến cấp độ khối là một điều tuyệt vời. Đó là lý do tại sao 6 đã được giới thiệu trong tiêu chuẩn từ lâu và hiện là một cách chính (cùng với 7) để khai báo một biến
Có cần thiết phải sử dụng var trong JavaScript không?Luôn khai báo các biến JavaScript với var , let hoặc const. Từ khóa var được sử dụng trong tất cả các mã JavaScript từ 1995 đến 2015. Từ khóa let và const đã được thêm vào JavaScript vào năm 2015. Nếu bạn muốn mã của mình chạy trong các trình duyệt cũ hơn, bạn phải sử dụng var .
Vấn đề với var trong JavaScript là gì?“var” không có phạm vi chặn
. Khi var bỏ qua các khối mã, chúng ta có một bài kiểm tra biến toàn cục. Như chúng ta có thể thấy, var xuyên qua if , for hoặc các khối mã khác. Đó là bởi vì từ lâu trong JavaScript, các khối không có Môi trường từ điển và var là phần còn lại của điều đó. |