JavaScript là một ngôn ngữ mạnh mẽ vì bạn có thể viết toàn bộ phần mềm mà không cần sử dụng bất kỳ ngôn ngữ lập trình nào khác
function run[] {var foo = "Foo";5 từng là một cách khai báo biến trong JavaScript. Tuy nhiên, việc khai báo một biến hoặc đối tượng theo cách này hiện rất hiếm do cơn ác mộng mà nó có thể tạo ra trong dự án JavaScript của bạn
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
var obj = {}
// instead let [or const] is used to declare a variable
Bắt đầu với ECMAScript 6, câu lệnh
function run[] {var foo = "Foo";6 đã được giới thiệu
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
Sau đây là tổng quan ngắn gọn về lý do tại sao
function run[] {var foo = "Foo";5 không còn hoặc hiếm khi được sử dụng trong các dự án JavaScript để khai báo biến
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
Ghi chú. Nếu bạn đã quen thuộc với những cạm bẫy khi sử dụng var, thì bài viết này vẫn có thể là một phần bổ sung hữu ích cho bạn
1. Phạm vi - lý do chính để tránh var
Phạm vi là sự khác biệt chính giữa var và let
Các biến
function run[] {var foo = "Foo";5 nằm trong phạm vi thân hàm ngay lập tức [do đó có phạm vi hàm] trong khi các biến
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";6 nằm trong phạm vi khối bao quanh ngay lập tức được biểu thị bằng
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";1
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
Hãy hiểu điều đó có nghĩa là gì thông qua mã
function run[] {var foo = "Foo";
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
Lý do tại sao từ khóa
function run[] {var foo = "Foo";6 được đưa vào ngôn ngữ này là do phạm vi chức năng khó hiểu và là một trong những nguyên nhân chính gây ra lỗi trong JavaScript
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
2. cẩu - không phải lo lắng cho function run[] {var foo = "Foo";
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
6
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
Đầu tiên, chúng ta cần tìm hiểu xem cẩu là gì
Các biến có thể truy cập được trong phạm vi kèm theo của chúng ngay cả trước khi chúng được khai báo
function run[] {
console.log[foo]; // undefined
// Hoisting in action !
var foo = "Foo";
console.log[foo]; // Foo
}
run[];
Nhưng không phải lo lắng.
function run[] {var foo = "Foo";4 sẽ không để điều đó xảy ra
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function checkHoisting[] {
console.log[foo]; // ReferenceError
let foo = "Foo";
console.log[foo]; // Foo
}
checkHoisting[];
3. Ràng buộc đối tượng toàn cục
Ở cấp cao nhất,
function run[] {var foo = "Foo";6, không giống như
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];function run[] {var foo = "Foo";5, không tạo thuộc tính trên đối tượng toàn cầu
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
var foo = "Foo"; // globally scoped
let bar = "Bar"; // not allowed to be globally scoped
console.log[window.foo]; // Foo
console.log[window.bar]; // undefined
4. khai báo lại. Không tốt với Let
Ở chế độ nghiêm ngặt,
function run[] {var foo = "Foo";5 sẽ cho phép bạn khai báo lại cùng một biến trong cùng một phạm vi trong khi
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];function run[] {var foo = "Foo";6 gây ra Lỗi Cú pháp
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
'use strict';
var foo = "foo1";
var foo = "foo2"; // No problem, 'foo1' is replaced with 'foo2'.
let bar = "bar1";
let bar = "bar2"; // SyntaxError: Identifier 'bar' has already been declared
Kiểm tra chủ đề thực tế để biết thêm hoặc viết trong các bình luận nếu bạn nghĩ rằng tôi đã bỏ lỡ bất cứ điều gì. Tôi sẽ thêm nó và cập nhật bài viết cho phù hợp
Vấn đề là,
function run[] {var foo = "Foo";6 tránh nguồn gây hiểu lầm, đặc biệt. dành cho các lập trình viên với các kỳ vọng được đặt bởi các ngôn ngữ có phạm vi khối. Một
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";5 có phạm vi chức năng [nó khai báo một biến hiển thị trong toàn bộ chức năng] mặc dù có vẻ như nó có phạm vi khối
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";5 có thể vẫn hữu ích trong trường hợp cực đoan như mã do máy tạo ra, nhưng tôi đang cố gắng hết sức ở đó
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
[
function run[] {var foo = "Foo";9 cũng mới và có phạm vi khối. Sau
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {
console.log[foo]; // undefined
// Hoisting in action !
var foo = "Foo";
console.log[foo]; // Foo
}
run[];
0, bạn có thể gán lại cho function run[] {
console.log[foo]; // undefined
// Hoisting in action !
var foo = "Foo";
console.log[foo]; // Foo
}
run[];
1, trong khi sau function run[] {
console.log[foo]; // undefined
// Hoisting in action !
var foo = "Foo";
console.log[foo]; // Foo
}
run[];
2, bạn không thể gán lại cho function f[x] {
let y = 1;
if [x > 0] {
let y = 2; // `let` declares a variable in this block
}
return y;
}
[f[1], f[-1]] // --> [1, 1]
// Start over, but change `let` to `var`.
// --> [2, 1]
0. Điều đó thường tốt hơn vì nó ngăn thứ gì đó vô tình thay đổi từ bên dưới bạn. Nhưng để rõ ràng, bạn vẫn có thể sửa đổi đối tượng function f[x] {
let y = 1;
if [x > 0] {
let y = 2; // `let` declares a variable in this block
}
return y;
}
[f[1], f[-1]] // --> [1, 1]
// Start over, but change `let` to `var`.
// --> [2, 1]
1 trừ khi bạn đóng băng nó. ]Trên thực tế, ấn tượng của bạn là phù hợp với ES6. Thông qua
function run[] {var foo = "Foo";6 và
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";9. Ngừng sử dụng
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";5
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
[Trong một màn trình diễn khác của "The Better Parts", Doug nói lý do tại sao
function f[x] {
let y = 1;
if [x > 0] {
let y = 2; // `let` declares a variable in this block
}
return y;
}
[f[1], f[-1]] // --> [1, 1]
// Start over, but change `let` to `var`.
// --> [2, 1]
5 được thêm vào thay vì sửa. function f[x] {
let y = 1;
if [x > 0] {
let y = 2; // `let` declares a variable in this block
}
return y;
}
[f[1], f[-1]] // --> [1, 1]
// Start over, but change `let` to `var`.
// --> [2, 1]
6 tạo ra một số kết quả "đáng ngạc nhiên", vì vậy chỉ cần áp dụng function f[x] {
let y = 1;
if [x > 0] {
let y = 2; // `let` declares a variable in this block
}
return y;
}
[f[1], f[-1]] // --> [1, 1]
// Start over, but change `let` to `var`.
// --> [2, 1]
5. ]
Một ví dụ tiết lộ
đưa ra một ví dụ trong đó
function run[] {var foo = "Foo";5 không hoạt động như dự kiến. Ví dụ của họ là một ví dụ thực tế đặt _____160 trình xử lý trong một trang web. Đây là một trường hợp thử nghiệm nhỏ hơn
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";3
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";5 làm chúng tôi vấp ngã vì tất cả các lần lặp lại chia sẻ cùng một biến
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";62 trong phạm vi chức năng, có giá trị
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";63 sau khi vòng lặp kết thúc
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
Một ví dụ khác
function run[] {var foo = "Foo";6 khai báo các biến trong phạm vi khối.
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];
function run[] {var foo = "Foo";5 khiến chúng ta bối rối khi đề cập đến cùng một biến trong toàn hàm
let bar = "Bar";
console.log[foo, bar]; // Foo Bar{
var moo = "Mooo"
let baz = "Bazz";
console.log[moo, baz]; // Mooo Bazz
}
console.log[moo]; // Mooo
console.log[baz]; // ReferenceError}run[];