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.
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
Vì
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
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ố
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.let x = 1;
{
let x = 2;
}
console.log[x]; // logs 1
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
7Tê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ả
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
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
}
0Bạ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
}
1Tuy 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
}
2Khu 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
}
3Thuậ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
}
4TDZ và let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
8
let name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
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
}
6TDZ 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
}
7Khố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
}
8Cá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
}
9Tuy 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
0Thông số kỹ thuật
Đặ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