Hướng dẫn javascript let scope if statement - javascript let phạm vi câu lệnh if

Rất nhiều lần tôi cần phải phân loại một biến chỉ cho một tuyên bố nếu một sự thật. Ví dụ:

let entry;
entry = entries.find(....);
if (entry) {
   // use entry
}

// i dont need entry here

Tôi đã thử các kết hợp tương tự như

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
1 như thế này:

if (let entry = entries.find(....)) {
   // user entry
}

Nhưng nó không hoạt động. Nếu tôi sử dụng

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 thay vì
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3, nó hoạt động nhưng biến mà nó đã nâng để nó không giới hạn ở khối câu lệnh IF.

Hướng dẫn javascript let scope if statement - javascript let phạm vi câu lệnh if

user7393973

2.1801 Huy hiệu vàng17 Huy hiệu bạc54 Huy hiệu đồng1 gold badge17 silver badges54 bronze badges

hỏi ngày 20 tháng 2 năm 2017 lúc 15:29Feb 20, 2017 at 15:29

NoitidartnoitidartNoitidart

33.7K33 Huy hiệu vàng131 Huy hiệu bạc299 Huy hiệu đồng33 gold badges131 silver badges299 bronze badges

3

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 tạo phạm vi khối, bạn cần tạo một khối khác xung quanh nó để giới hạn phạm vi của nó.

Một câu lệnh khối được sử dụng để nhóm không hoặc nhiều câu lệnh. Khối được phân định bởi một cặp dấu ngoặc xoăn.

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1

Ngoài ra, bạn có thể sử dụng biểu thức chức năng được gọi ngay lập tức:

(function () {
    let entry = 6;

    if (entry) {
        console.log(entry);
    }
 })()
// Variable entry is not accessible from the outside scope

Đã trả lời ngày 20 tháng 2 năm 2017 lúc 15:33Feb 20, 2017 at 15:33

0

Đây có lẽ là một thành ngữ không bao giờ được tạo ra cho JS, nhưng chỉ dành cho những cú đá, đây là một người trợ giúp có thể được sử dụng, mặc dù câu trả lời khác có lẽ đúng hơn.

Điều này được lấy cảm hứng từ

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
5 của Clojure, thực hiện chính xác những gì bạn đang tìm kiếm, nhưng không yêu cầu một chức năng vì nó là một macro:

function ifDo (maybeTrueVal, doF) {
    if (maybeTrueVal) {
        doF(maybeTrueVal);
    }
}

ifDo(entries.find(....), (truthyVal) => {
    console.log(truthyVal);
});

Đã trả lời ngày 20 tháng 2 năm 2017 lúc 16:00Feb 20, 2017 at 16:00

Hướng dẫn javascript let scope if statement - javascript let phạm vi câu lệnh if

CarcigenicatecigenicateCarcigenicate

41K9 Huy hiệu vàng65 Huy hiệu bạc105 Huy hiệu Đồng9 gold badges65 silver badges105 bronze badges

1

Tuyên bố

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 khai báo một biến cục bộ có khối, tùy chọn khởi tạo nó thành một giá trị.
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3
declaration declares a block-scoped local variable, optionally initializing it to a value.

Thử nó

Cú pháp

let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]

Thông số

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
7

Tên của biến hoặc biến để khai báo. Mỗi người phải là một định danh JavaScript hợp pháp.

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
8 Tùy chọnOptional

Đối với mỗi biến được khai báo, bạn có thể tùy ý chỉ định giá trị ban đầu của nó cho bất kỳ biểu thức JavaScript pháp lý nào.

Ngoài ra, cú pháp gán phá hủy cũng có thể được sử dụng để khai báo các biến.

let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */

Sự mô tả

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 cho phép bạn khai báo các biến được giới hạn trong phạm vi của câu lệnh khối hoặc biểu thức mà nó được sử dụng, không giống như từ khóa
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2, tuyên bố một biến trên toàn cầu hoặc cục bộ cho toàn bộ hàm bất kể phạm vi khối. Sự khác biệt khác giữa
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 và
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 là cái sau chỉ có thể được truy cập sau khi đạt được tuyên bố của nó (xem vùng chết tạm thời). Vì lý do này, các tuyên bố
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 thường được coi là không đáng sợ.
allows you to declare variables that are limited to the scope of a block statement, or expression on which it is used, unlike the
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 keyword, which declares a variable globally, or locally to an entire function regardless of block scope. The other difference between
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 and
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 is that the latter can only be accessed after its declaration is reached (see temporal dead zone). For this reason,
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 declarations are commonly regarded as non-hoisted.

Giống như

(function () {
    let entry = 6;

    if (entry) {
        console.log(entry);
    }
 })()
// Variable entry is not accessible from the outside scope
4
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 không tạo ra các thuộc tính của đối tượng
(function () {
    let entry = 6;

    if (entry) {
        console.log(entry);
    }
 })()
// Variable entry is not accessible from the outside scope
6 khi được khai báo trên toàn cầu (trong phạm vi hàng đầu nhất).

Một lời giải thích về lý do tại sao cái tên "hãy để" được chọn có thể được tìm thấy ở đây.let" was chosen can be found here.

Nhiều vấn đề với các biến

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 có thể tránh được bằng cách khai báo chúng ở đầu phạm vi mà chúng được sử dụng (làm như vậy có thể tác động đến khả năng đọc).

Không giống như

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2,
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 bắt đầu khai báo, không phải tuyên bố. Điều đó có nghĩa là bạn không thể sử dụng khai báo đơn độc
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 làm phần thân của một khối (điều này có ý nghĩa, vì không có cách nào để truy cập biến).

if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context

Ví dụ

Quy tắc phạm vi

Các biến được khai báo bởi

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 có phạm vi của chúng trong khối mà chúng được khai báo, cũng như trong bất kỳ khối nào có chứa. Theo cách này,
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 hoạt động rất giống
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2. Sự khác biệt chính là phạm vi của biến
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 là toàn bộ hàm kèm theo:
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3
have their scope in the block for which they are declared, as well as in any contained sub-blocks. In this way,
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3
works very much like
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2
. The main difference is that the scope of a
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2
variable is the entire enclosing function:

function varTest() {
  var x = 1;
  {
    var x = 2;  // same variable!
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

function letTest() {
  let x = 1;
  {
    let x = 2;  // different variable
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

Ở cấp cao nhất của các chương trình và chức năng,

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3, không giống như
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2, không tạo ra một thuộc tính trên đối tượng toàn cầu. Ví dụ:
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3
, unlike
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2
, does not create a property on the global object. For example:

var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined

REDECLARATION

Việc kiểm tra lại cùng một biến trong cùng một hàm hoặc phạm vi khối làm tăng

function ifDo (maybeTrueVal, doF) {
    if (maybeTrueVal) {
        doF(maybeTrueVal);
    }
}

ifDo(entries.find(....), (truthyVal) => {
    console.log(truthyVal);
});
7.

if (let entry = entries.find(....)) {
   // user entry
}
0

Bạn có thể gặp lỗi trong các câu lệnh

function ifDo (maybeTrueVal, doF) {
    if (maybeTrueVal) {
        doF(maybeTrueVal);
    }
}

ifDo(entries.find(....), (truthyVal) => {
    console.log(truthyVal);
});
8 vì chỉ có một khối.

if (let entry = entries.find(....)) {
   // user entry
}
1

Tuy nhiên, điều quan trọng là chỉ ra rằng một khối được lồng trong một mệnh đề trường hợp sẽ tạo ra một môi trường từ vựng phạm vi khối mới, sẽ không tạo ra các lỗi điều chỉnh lại được hiển thị ở trên.

if (let entry = entries.find(....)) {
   // user entry
}
2

Khu vực chết tạm thời (TDZ)

Một biến

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 hoặc
(function () {
    let entry = 6;

    if (entry) {
        console.log(entry);
    }
 })()
// Variable entry is not accessible from the outside scope
4 được cho là ở "vùng chết tạm thời" (TDZ) từ đầu khối cho đến khi thực thi mã đạt đến dòng nơi biến được khai báo và khởi tạo.

Mặc dù bên trong TDZ, biến không được khởi tạo với giá trị và bất kỳ nỗ lực nào để truy cập nó sẽ dẫn đến

let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
1. Biến được khởi tạo với một giá trị khi thực thi đạt đến dòng mã nơi nó được khai báo. Nếu không có giá trị ban đầu được chỉ định với khai báo biến, nó sẽ được khởi tạo với giá trị
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
2.

Điều này khác với các biến

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2, sẽ trả về giá trị
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
2 nếu chúng được truy cập trước khi chúng được khai báo. Mã dưới đây cho thấy kết quả khác nhau khi
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 và
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 được truy cập trong mã trước dòng chúng được khai báo.

if (let entry = entries.find(....)) {
   // user entry
}
3

Thuật ngữ "tạm thời" được sử dụng vì vùng phụ thuộc vào thứ tự thực thi (thời gian) thay vì thứ tự mã được viết (vị trí). Ví dụ: mã bên dưới hoạt động bởi vì, mặc dù hàm sử dụng biến

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 xuất hiện trước khi biến được khai báo, hàm được gọi bên ngoài TDZ.

if (let entry = entries.find(....)) {
   // user entry
}
4

TDZ và
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
8

Sử dụng toán tử

let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
8 cho biến
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 trong TDZ của nó sẽ ném
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
1:

if (let entry = entries.find(....)) {
   // user entry
}
5

Điều này khác với việc sử dụng

let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
8 cho các biến không được khai báo và các biến chứa giá trị
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
2:

if (let entry = entries.find(....)) {
   // user entry
}
6

TDZ kết hợp với phạm vi từ vựng

Mã sau đây dẫn đến

let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
1 tại dòng hiển thị:

if (let entry = entries.find(....)) {
   // user entry
}
7

Khối

let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
5 được đánh giá vì bên ngoài
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 có giá trị. Tuy nhiên, do phạm vi từ vựng giá trị này không có sẵn bên trong khối: định danh
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
7 bên trong khối
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
5 là
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
9. Biểu thức
if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0 ném
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
1 vì việc khởi tạo
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
9 chưa hoàn thành - nó vẫn ở vùng chết tạm thời.

Hiện tượng này có thể gây nhầm lẫn trong một tình huống như sau. Hướng dẫn

if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
3 đã nằm trong phạm vi riêng của khối FOR LOOP. Vì vậy, định danh
if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
4 được giải quyết cho thuộc tính '
if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
5' của đối tượng '
if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
6' nằm trong phần đầu tiên của chính lệnh (
if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
7).

Đây vẫn là trong khu vực chết tạm thời vì tuyên bố tuyên bố của nó chưa đạt được và chấm dứt.

if (let entry = entries.find(....)) {
   // user entry
}
8

Các tình huống khác

Khi được sử dụng bên trong một khối,

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 giới hạn phạm vi của biến trong khối đó. Lưu ý sự khác biệt giữa
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2, có phạm vi bên trong hàm nơi nó được khai báo.
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3
limits the variable's scope to that block. Note the difference between
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2
, whose scope is inside the function where it is declared.

if (let entry = entries.find(....)) {
   // user entry
}
9

Tuy nhiên, sự kết hợp của tuyên bố

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 và
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3 dưới đây là
function ifDo (maybeTrueVal, doF) {
    if (maybeTrueVal) {
        doF(maybeTrueVal);
    }
}

ifDo(entries.find(....), (truthyVal) => {
    console.log(truthyVal);
});
7 do
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2 được nâng lên đỉnh của khối. Điều này dẫn đến việc khai báo lại ẩn của biến.
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2
and
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
3
declaration below is a
function ifDo (maybeTrueVal, doF) {
    if (maybeTrueVal) {
        doF(maybeTrueVal);
    }
}

ifDo(entries.find(....), (truthyVal) => {
    console.log(truthyVal);
});
7 due to
let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
2
being hoisted to the top of the block. This results in an implicit re-declaration of the variable.

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
0

Thông số kỹ thuật

Sự chỉ rõ
Đặc tả ngôn ngữ Ecmascript # Sec-Let-and-Const-Declarations
# sec-let-and-const-declarations

Tính tương thích của trình duyệt web

Bảng BCD chỉ tải trong trình duyệt

Xem thêm

Có phải nếu các tuyên bố phạm vi JavaScript?

Câu lệnh IF giới thiệu phạm vi khối bằng cách sử dụng câu lệnh khối.Chúng tôi nói rằng FOO được phân tích khối cho câu lệnh IF.Điều này có nghĩa là nó chỉ có thể được truy cập từ bên trong khối đó.. We say that foo is block-scoped to the if statement. This means it can only be accessed from within that block.

Có phải phạm vi chức năng trong JavaScript?

Từ khóa LET được sử dụng để khai báo các biến trong JavaScript.Từ khóa VAR cũng có thể được sử dụng để khai báo các biến, nhưng sự khác biệt chính giữa chúng nằm trong phạm vi của chúng.VAR là chức năng phạm vi trong khi LET là khối phạm vi - chúng ta sẽ thảo luận chi tiết hơn sau này.let is block scoped - we will discuss this in more detail later.

Có phải nếu các tuyên bố phạm vi?

Nếu bạn chưa bắt gặp thuật ngữ này trước đó, phạm vi của một biến là mã có thể truy cập được. Các biến được xác định trong một hàm, câu lệnh hoặc khối điều khiển khác được phân chia đến khối đó.Variables defined within a function, if statement, or other control block are scoped to that block.

Chức năng cho phép có được không?

VAR và cho phép cả hai được sử dụng để khai báo biến trong JavaScript nhưng sự khác biệt giữa chúng là VAR là chức năng phạm vi và LET là Khối phạm vi.var is function scoped and let is block scoped.