Từ khóa var có cần thiết trong JavaScript không?

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";
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[];
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

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";
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 đã được giới thiệu

Sau đây là tổng quan ngắn gọn về lý do tại sao

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[];
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

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";
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[];
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
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 nằm trong phạm vi khối bao quanh ngay lập tức được biểu thị bằng
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[];
1

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";
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 đượ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

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

Đầ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";
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[];
4 sẽ không để điều đó xảy ra

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";
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, không giống như
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[];
5, không tạo thuộc tính trên đối tượng toàn cầu

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";
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[];
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
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 gây ra Lỗi Cú pháp

'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";
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 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
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[];
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

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[];
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 ở đó

[

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[];
9 cũng mới và có phạm vi khối. Sau
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";
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 và
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[];
9. Ngừng sử dụng
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[];
5

[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";
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[];
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

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[];
3

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[];
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
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[];
62 trong phạm vi chức năng, có giá trị
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[];
63 sau khi vòng lặp kết thúc


Một ví dụ khác

________số 8

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 khai báo các biến trong phạm vi khối.
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[];
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

Tôi có nên sử dụng var trong JavaScript không?

Sự thật là không ai nên sử dụng var trong bất kỳ mã JavaScript nào ngoại trừ bài học lịch sử . Thậm chí sau đó, nó sẽ đi kèm với một chú thích có nội dung như "làm ơn đừng bao giờ làm điều này. " Let và const đã có mặt trên mọi trình duyệt chính trong 6 năm qua. Điều này thực sự, thực sự cổ xưa trong những năm trước.

Từ khóa var có phải là tùy chọn trong JavaScript không?

Có đúng không?

Tại sao tôi không nên sử dụng var trong JavaScript?

Phạm vi — lý do chính để tránh var . scoped to the immediate function body [hence the function scope] while let variables are scoped to the immediate enclosing block denoted by { } .

Var có còn hoạt động trong JavaScript không?

Các biến được khai báo bên ngoài bất kỳ chức năng và khối nào là toàn cục và được cho là có Phạm vi toàn cầu. Điều này có nghĩa là bạn có thể truy cập chúng từ bất kỳ phần nào của chương trình JavaScript hiện tại. Bạn có thể sử dụng var , let và const để khai báo các biến toàn cục . Nhưng bạn không nên làm điều đó quá thường xuyên.

Chủ Đề