Phân tích var và let trong khai báo biến Javascript

Ae cho mình hỏi vấn đề như này:
Mình làm 1 bài tập nhỏ tạo hàm nhận vào 1 chuỗi ký tự và phải trả về 1 chuỗi khác là đảo ngược lại chuỗi ban đầu. VD: nhập chuỗi “hello” thì sẽ trả về là “olleh”.

Mình trình bày như hình 1. Trong for loop mình khai báo

var result = ""

chương trình chạy bình thường.
Nhưng nếu đổi thành

let result = ""

thì chương trình sẽ báo lỗi.

nhưng nếu mình ko khai báo let result = "" trong for loop mà khai báo bên trên thì chương trình vẫn chạy bình thường.

Ae phân tích hộ sự khác nhau dc ko ạ?

let có block scope và chỉ được khai báo 1 lần.
var có function scope.

5 Likes

Bạn tìm hiểu mối liên hệ giữa var, let, const với lexical environments nhé

Lí do: dùng var thì biến được định nghĩa ở closest function/ global lexical environmnet (block environment bị bỏ qua). Trong vd của bạn thì cả result và i đang nằm ở closest function lexical environment tức là function reverseString (block for bị bỏ qua), đó là lí do biến result và i mặc dù được định nghĩa trong for nhưng sau khi kết thúc vòng lặp thì ở dòng 5 vẫn truy cập được và return trả về giá trị.

Nhưng nếu bạn thay bằng let thì biến nằm ở closest lexical environment (đó có thể là block environment, loop environment, function/ global environment). Lúc này cả biến result và i chỉ nằm trong block for, bên ngoài không truy cập được => return result sẽ báo lỗi.
==> Nên dùng let, const thay vì dùng var bạn nhé.
(Ảnh minh họa trạng thái của lexical environment khi hoàn thành vòng loop với argument = ‘hello’, dùng var để khai báo theo đoạn code của bạn)

4 Likes

ra là vậy, thanks bro.

à ra thế, cám ơn bạn nhiều nhé!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?