Tại sao Var và Let khác nhau trong trường hợp này
Mình có thắc mắc thế này:
- Var tạo ra vùng truy cập trong 1 Function - Scope khi được định nghĩa bên trong 1 function :
function name_function{
var x ;
// function scope
}
- let tạo ra vùng truy cập trong 1 Block - Scope khi được định nghĩa bên trong 1 cặp { } - thường trong diều kiện :if() { } hoặc vòng lặp for () { } :
if (condition) {
let x ;
// block scope
}
Vậy chúng chỉ thực sự khác nhau khi được định nghĩa bên trong cặp { }.
Tuy nhiên trong trường hợp ví dụ này : http://jsfiddle.net/rmXcF/5/ chúng được khai báo bên ngoài cặp {} của vòng for mà sao chúng vẫn có sự khác nhau.
Bạn nào giải thích giúp mình với ạ ? Mình xin Cám ơn mọi người
3 CÂU TRẢ LỜI
Vậy chúng chỉ thực sự khác nhau khi được định nghĩa bên trong cặp { }.
Chính xác là dùng {}
có thể tạo ra một block, đối với các hàm if
, while
, switch
, case
...
còn với vòng lặp (for
, for-in
, for-of
) thì bạn cũng có thể tạo ra một biến với block scope thông qua việc khai báo bên trong ()
.
Với mỗi một iteration
(lần lặp), sẽ có một lần binding được diễn ra, hay nói cách khác có một block scope được tạo ra, và phần initialization
của vòng for
được thực thi trong scope đó.
Bạn cứ coi đó là một công dụng đặc biệt của let
khi dùng với vòng lặp đi
cám ơn bạn nhiều ạ
Bạn tham khảo câu hỏi này trên Viblo này: https://viblo.asia/q/nho-giai-thich-gia-tri-bien-i-trong-doan-code-W65GWL2j5DO
Trong trường hợp sử dụng var bạn có thể thử:
for(var i=1; i<6; i++) {
(function() {
var j = i;
$("#div" + i).click(
function () { alert(j); }
);
})();
}
Mình nghĩ let cũng cho tác dụng tương tự.
Cám ơn bạn, mình cũng biết có 1 số cách để khắc phục được bài toán trên trong đó cũng có cách của bạn đưa ra. Cái mình thắc mắc lúc đó như nói ở trên là let và var khi chúng được khai báo không phải bên trong cặp {}.