Trong javascript, câu lệnh x y ngụ ý rằng

Chương 3 đã mô tả các biểu thức dưới dạng các cụm từ JavaScript. Theo cách tương tự đó, các câu lệnh là các câu hoặc lệnh JavaScript. Giống như các câu tiếng Anh được kết thúc và phân tách với nhau bằng dấu chấm, câu lệnh JavaScript được kết thúc bằng dấu chấm phẩy [Dấu chấm phẩy tùy chọn]. Các biểu thức được đánh giá để tạo ra một giá trị, nhưng các câu lệnh được thực thi để thực hiện điều gì đó

Một cách để âlàm điều gì đó xảy raâ là đánh giá một biểu thức có tác dụng phụ. Các biểu thức có tác dụng phụ, chẳng hạn như các phép gán và lời gọi hàm, có thể đứng một mình dưới dạng các câu lệnh và khi được sử dụng theo cách này, chúng được gọi là các câu lệnh biểu thức. Một loại câu lệnh tương tự là các câu lệnh khai báo khai báo các biến mới và định nghĩa các hàm mới

Các chương trình JavaScript không gì khác hơn là một chuỗi các câu lệnh để thực thi. Theo mặc định, trình thông dịch JavaScript thực hiện lần lượt các câu lệnh này theo thứ tự chúng được viết. Một cách khác để làm cho điều gì đó xảy ra là thay đổi thứ tự thực thi mặc định này và JavaScript có một số câu lệnh hoặc cấu trúc điều khiển thực hiện việc này

Bảng 4-1 tóm tắt cú pháp câu lệnh JavaScript và các phần theo sau nó mô tả chi tiết hơn từng câu lệnh

Các loại câu lệnh đơn giản nhất trong JavaScript là các biểu thức có tác dụng phụ. Loại tuyên bố này đã được trình bày trong Chương 3. Câu lệnh gán là một loại chính của câu lệnh biểu thức. Ví dụ

greeting = "Hello " + name;
i *= 3;

Các toán tử tăng và giảm,

;
0 và
;
1, có liên quan đến các câu lệnh gán. Những điều này có tác dụng phụ là thay đổi một giá trị biến, giống như thể một nhiệm vụ đã được thực hiện

counter++;

Toán tử

;
2 có tác dụng phụ quan trọng là xóa thuộc tính đối tượng. Do đó, nó hầu như luôn được sử dụng như một câu khẳng định, thay vì là một phần của biểu thức lớn hơn.

delete o.x;

Lời gọi hàm là một phạm trù chính khác của các câu lệnh biểu thức. Ví dụ

alert[greeting];
window.close[];

Các lệnh gọi hàm phía máy khách này là các biểu thức, nhưng chúng có tác dụng phụ ảnh hưởng đến trình duyệt web và được sử dụng ở đây dưới dạng câu lệnh

Một khối câu lệnh kết hợp nhiều câu lệnh thành một câu lệnh phức hợp duy nhất. Một khối câu lệnh chỉ đơn giản là một chuỗi các câu lệnh được đặt trong dấu ngoặc nhọn. Do đó, các dòng sau hoạt động như một câu lệnh đơn và có thể được sử dụng ở bất kỳ đâu mà JavaScript mong đợi một câu lệnh đơn

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}

Việc kết hợp các câu lệnh thành các khối câu lệnh lớn hơn là cực kỳ phổ biến trong lập trình JavaScript. Giống như các biểu thức thường chứa các biểu thức con, nhiều câu lệnh JavaScript chứa các câu con. Về mặt hình thức, cú pháp JavaScript thường cho phép một câu lệnh con duy nhất. Ví dụ: cú pháp vòng lặp

;
3 bao gồm một câu lệnh đóng vai trò là phần thân của vòng lặp. Sử dụng một khối câu lệnh, bạn có thể đặt bất kỳ số lượng câu lệnh nào trong câu lệnh con được phép duy nhất này

Một câu lệnh ghép cho phép bạn sử dụng nhiều câu lệnh trong đó cú pháp JavaScript yêu cầu một câu lệnh đơn. Câu lệnh rỗng thì ngược lại. nó cho phép bạn không bao gồm câu lệnh nào được mong đợi

Tuyên bố trống trông như thế này

;

Trình thông dịch JavaScript không thực hiện hành động nào khi nó thực thi một câu lệnh trống. Câu lệnh rỗng đôi khi hữu ích khi bạn muốn tạo một vòng lặp có phần thân rỗng

;
0

;
4 và
;
5 là các câu lệnh khai báo—chúng khai báo hoặc định nghĩa các biến và hàm. Các câu lệnh này xác định các mã định danh [tên biến và hàm] có thể được sử dụng ở nơi khác trong chương trình của bạn và gán giá trị cho các mã định danh đó. Bản thân các câu lệnh khai báo không làm được gì nhiều, nhưng bằng cách tạo các biến và hàm, theo một nghĩa quan trọng, chúng xác định ý nghĩa của các câu lệnh khác trong chương trình của bạn

Câu lệnh

;
4 khai báo một biến hoặc nhiều biến. Đây là cú pháp

;
4

Từ khóa

;
4 được theo sau bởi một danh sách các biến được phân tách bằng dấu phẩy để khai báo; . Ví dụ

;
6

Nếu một câu lệnh

;
4 xuất hiện trong phần thân của một hàm, nó sẽ xác định các biến cục bộ, nằm trong phạm vi của hàm đó. Khi
;
4 được sử dụng trong mã cấp cao nhất, nó sẽ khai báo các biến toàn cục, hiển thị trong toàn bộ chương trình JavaScript

Nếu không có bộ khởi tạo nào được chỉ định cho một biến với câu lệnh

;
4, thì giá trị ban đầu của biến đó là
;
01

Lưu ý rằng câu lệnh

;
4 cũng có thể xuất hiện như một phần của vòng lặp
;
03 và
;
04

;
4

Từ khóa

;
5 được sử dụng để xác định chức năng. Chúng ta đã thấy nó trong các biểu thức định nghĩa hàm trong Định nghĩa hàm. Nó cũng có thể được sử dụng ở dạng tuyên bố. Xét hai hàm sau

counter++;
0

Một câu lệnh khai báo hàm có cú pháp như sau

counter++;
1

;
06 là một mã định danh đặt tên cho hàm được khai báo. Tên hàm được theo sau bởi một danh sách các tên tham số được phân tách bằng dấu phẩy trong ngoặc đơn. Các mã định danh này có thể được sử dụng trong phần thân của hàm để chỉ các giá trị đối số được truyền khi hàm được gọi

Phần thân của hàm bao gồm bất kỳ số lượng câu lệnh JavaScript nào, được chứa trong dấu ngoặc nhọn. Các câu lệnh này không được thực thi khi chức năng được xác định. Thay vào đó, chúng được liên kết với đối tượng hàm mới để thực thi khi hàm được gọi

Dưới đây là một số ví dụ khác về khai báo hàm

counter++;
2

Các câu lệnh khai báo hàm có thể xuất hiện trong mã JavaScript cấp cao nhất hoặc chúng có thể được lồng trong các hàm khác. Tuy nhiên, khi được lồng vào nhau, các khai báo hàm chỉ có thể xuất hiện ở cấp cao nhất của hàm mà chúng được lồng vào bên trong. Nghĩa là, các định nghĩa hàm có thể không xuất hiện trong các câu lệnh

;
07, vòng lặp
;
3 hoặc bất kỳ câu lệnh nào khác

Các câu lệnh khai báo hàm khác với các biểu thức định nghĩa hàm ở chỗ chúng bao gồm tên hàm. Cả hai hình thức đều tạo ra một đối tượng hàm mới, nhưng câu lệnh khai báo hàm cũng khai báo tên hàm như một biến và gán đối tượng hàm cho nó. Giống như các biến được khai báo với

;
4, các hàm được xác định bằng các câu lệnh định nghĩa hàm được “hoistedâ” hoàn toàn lên đầu tập lệnh hoặc hàm chứa, do đó tất cả các hàm trong tập lệnh hoặc tất cả các hàm lồng nhau trong một hàm đều được khai báo trước bất kỳ mã nào khác . Điều này có nghĩa là bạn có thể gọi một hàm JavaScript trước khi khai báo nó

Các câu lệnh điều kiện thực hiện hoặc bỏ qua các câu lệnh khác tùy thuộc vào giá trị của một biểu thức đã chỉ định. Các câu lệnh này là các điểm quyết định trong mã của bạn và đôi khi chúng còn được gọi là ânhánh. â Nếu bạn hình dung trình thông dịch JavaScript đi theo một đường dẫn trong mã của bạn, thì các câu lệnh điều kiện là nơi mã phân nhánh thành hai hoặc nhiều đường dẫn và trình thông dịch phải chọn đường dẫn để đi theo

Câu lệnh

;
07 là câu lệnh điều khiển cơ bản cho phép JavaScript thực thi các câu lệnh có điều kiện. Tuyên bố này có hai hình thức. Đầu tiên là

counter++;
3

Ở dạng này,

;
41 được đánh giá. Nếu giá trị kết quả là đúng, thì
;
42 được thực thi. Nếu
;
41 là false, thì
;
42 không được thực thi

counter++;
4

Lưu ý rằng các dấu ngoặc đơn xung quanh

;
41 là một phần bắt buộc của cú pháp cho câu lệnh
;
07

Dạng thứ hai của câu lệnh

;
07 giới thiệu một mệnh đề
;
48 được thực hiện khi
;
41 là
;
60. Cú pháp của nó là

counter++;
5

Dạng câu lệnh này thực thi

;
61 nếu
;
41 đúng và thực hiện
;
63 nếu
;
41 sai. Ví dụ

counter++;
6

Câu lệnh

;
65 đánh giá một biểu thức và thực thi một trong hai đoạn mã, tùy thuộc vào kết quả. Nhưng còn khi bạn cần thực thi một trong nhiều đoạn mã thì sao? .
;
66 không thực sự là một câu lệnh JavaScript, mà chỉ đơn giản là một thành ngữ lập trình thường được sử dụng khi sử dụng các câu lệnh
;
65 lặp đi lặp lại

counter++;
7

Không có gì đặc biệt về mã này. Nó chỉ là một loạt các câu lệnh

;
07, trong đó mỗi câu lệnh
;
07 sau đây là một phần của mệnh đề
;
48 của câu lệnh trước đó. Sử dụng thành ngữ
;
66 thích hợp hơn và dễ đọc hơn là viết những câu này ra ở dạng lồng nhau đầy đủ về mặt cú pháp của chúng

counter++;
8

Câu lệnh

;
07 tạo ra một nhánh trong luồng thực thi của chương trình và bạn có thể sử dụng thành ngữ
;
66 để thực hiện một nhánh nhiều nhánh. Tuy nhiên, đây không phải là giải pháp tốt nhất khi tất cả các nhánh phụ thuộc vào giá trị của cùng một biểu thức. Trong trường hợp này, thật lãng phí khi đánh giá lại biểu thức đó trong nhiều câu lệnh
;
07

Câu lệnh

;
46 xử lý chính xác tình huống này. Từ khóa
;
46 được theo sau bởi một biểu thức trong ngoặc đơn và một khối mã trong dấu ngoặc nhọn

counter++;
9

Tuy nhiên, cú pháp đầy đủ của câu lệnh

;
46 phức tạp hơn cú pháp này. Các vị trí khác nhau trong khối mã được gắn nhãn bằng từ khóa
;
49 theo sau là biểu thức và dấu hai chấm.
;
49 giống như một câu lệnh được gắn nhãn, ngoại trừ việc thay vì đặt tên cho câu lệnh được gắn nhãn, nó liên kết một biểu thức với câu lệnh. Khi một
;
46 thực thi, nó sẽ tính toán giá trị của
;
41 và sau đó tìm nhãn
;
49 có biểu thức đánh giá cùng một giá trị [trong đó tính giống nhau được xác định bởi toán tử
counter++;
04]. Nếu tìm thấy, nó sẽ bắt đầu thực thi khối mã tại câu lệnh được gắn nhãn bởi
;
49. Nếu nó không tìm thấy một
;
49 có giá trị phù hợp, nó sẽ tìm một câu lệnh có nhãn
counter++;
07. Nếu không có nhãn ________ 307, câu lệnh ________ 246 sẽ bỏ qua toàn bộ khối mã

Câu lệnh

;
46 sau đây tương đương với câu lệnh
;
65 được lặp lại trong phần trước

delete o.x;
0

Lưu ý từ khóa

counter++;
12 được sử dụng ở cuối mỗi
;
49 trong đoạn mã trên. Câu lệnh
counter++;
12, được mô tả sau trong chương này, khiến trình thông dịch thoát ra khỏi câu lệnh
;
46 và tiếp tục với câu lệnh theo sau nó. Mệnh đề
;
49 trong câu lệnh
;
46 chỉ xác định điểm bắt đầu của mã mong muốn; . Trong trường hợp không có câu lệnh
counter++;
12, câu lệnh
;
46 bắt đầu thực thi khối mã của nó tại nhãn
;
49 khớp với giá trị của
;
41 của nó và tiếp tục thực hiện các câu lệnh cho đến khi đến cuối khối. Thông thường, bạn sẽ muốn kết thúc mỗi
;
49 bằng một câu lệnh
counter++;
12 hoặc
counter++;
24

Đây là một ví dụ thực tế hơn về câu lệnh

;
46;

delete o.x;
1

Lưu ý rằng trong hai ví dụ trước, các từ khóa

;
49 được theo sau bởi số và chuỗi ký tự tương ứng. Đây là cách mà câu lệnh
;
46 thường được sử dụng nhất trong thực tế, nhưng lưu ý rằng tiêu chuẩn ECMAScript cho phép mỗi
;
49 được theo sau bởi một biểu thức tùy ý

Để hiểu các câu lệnh có điều kiện, chúng tôi đã tưởng tượng trình thông dịch JavaScript đi theo một đường dẫn phân nhánh thông qua mã nguồn của bạn. Các câu lệnh lặp là những câu lệnh uốn ngược đường dẫn đó để lặp lại các phần mã của bạn. JavaScript có bốn câu lệnh lặp.

;
3,
counter++;
30,
;
03 và
;
04

Câu lệnh

;
3 là vòng lặp cơ bản của JavaScriptâ. Nó có cú pháp sau

delete o.x;
2

Để thực thi câu lệnh

;
3, trước tiên trình thông dịch đánh giá
;
41. Nếu giá trị của biểu thức là sai, thì trình thông dịch sẽ bỏ qua
;
42 đóng vai trò là thân vòng lặp và chuyển sang câu lệnh tiếp theo trong chương trình. Mặt khác, nếu
;
41 là đúng, trình thông dịch thực hiện
;
42 và lặp lại, nhảy trở lại đầu vòng lặp và đánh giá lại
;
41. Một cách khác để nói điều này là trình thông dịch thực thi
;
42 lặp đi lặp lại trong khi
;
41 là trung thực. Lưu ý rằng bạn có thể tạo một vòng lặp vô hạn với cú pháp
counter++;
42

Đây là một ví dụ về vòng lặp

;
3 in các số từ 0 đến 9

delete o.x;
3

Như bạn có thể thấy, biến

counter++;
44 bắt đầu từ 0 và được tăng lên mỗi khi phần thân của vòng lặp chạy. Khi vòng lặp đã thực hiện 10 lần, biểu thức sẽ trở thành
;
60 [i. e. , biến
counter++;
44 không còn nhỏ hơn 10], câu lệnh
;
3 kết thúc và trình thông dịch có thể chuyển sang câu lệnh tiếp theo trong chương trình

Vòng lặp

counter++;
30 giống như vòng lặp
;
3, ngoại trừ biểu thức vòng lặp được kiểm tra ở cuối vòng lặp thay vì ở trên cùng. Điều này có nghĩa là phần thân của vòng lặp luôn được thực hiện ít nhất một lần. Cú pháp của vòng lặp tương đối không phổ biến này là

delete o.x;
4

Đây là một ví dụ về vòng lặp

counter++;
30

delete o.x;
5

Câu lệnh

;
03 đơn giản hóa các vòng lặp theo một mẫu chung. Hầu hết các vòng lặp đều có một số loại biến đếm. Biến này được khởi tạo trước khi vòng lặp bắt đầu và được kiểm tra trước mỗi lần lặp của vòng lặp. Cuối cùng, biến đếm được tăng lên hoặc được cập nhật ở cuối thân vòng lặp, ngay trước khi biến được kiểm tra lại. Trong loại vòng lặp này, khởi tạo, kiểm tra và cập nhật là ba thao tác quan trọng của một biến vòng lặp. Câu lệnh
;
03 mã hóa từng thao tác trong số ba thao tác này dưới dạng một biểu thức và làm cho các biểu thức đó trở thành một phần rõ ràng của cú pháp vòng lặp

delete o.x;
6

counter++;
53,
counter++;
54 và
counter++;
55 là ba biểu thức [được phân tách bằng dấu chấm phẩy] chịu trách nhiệm khởi tạo, kiểm tra và tăng biến vòng lặp. Đặt tất cả chúng vào dòng đầu tiên của vòng lặp giúp bạn dễ hiểu vòng lặp
;
03 đang làm gì và ngăn ngừa các lỗi như quên khởi tạo hoặc tăng biến vòng lặp

Cách đơn giản nhất để giải thích cách hoạt động của vòng lặp

;
03 là hiển thị vòng lặp
;
3 tương đương

delete o.x;
7

Nói cách khác, biểu thức

counter++;
53 được đánh giá một lần trước khi vòng lặp bắt đầu. Để hữu ích, biểu thức này phải có tác dụng phụ [thường là một nhiệm vụ]. JavaScript cũng cho phép
counter++;
53 trở thành câu lệnh khai báo biến
;
4 để bạn có thể khai báo và khởi tạo bộ đếm vòng lặp cùng một lúc. Biểu thức
counter++;
54 được đánh giá trước mỗi lần lặp và kiểm soát xem phần thân của vòng lặp có được thực thi hay không. Nếu
counter++;
54 đánh giá thành một giá trị trung thực, thì _____142 là phần thân của vòng lặp được thực thi. Cuối cùng, biểu thức
counter++;
55 được đánh giá. Một lần nữa, đây phải là một biểu thức có tác dụng phụ để có ích. Nói chung, nó là một biểu thức gán, hoặc nó sử dụng các toán tử
;
0 hoặc
;
1

Chúng ta có thể in các số từ 0 đến 9 bằng vòng lặp

;
03 như sau. Tương phản nó với vòng lặp
;
3 tương đương được hiển thị ở trên

delete o.x;
8

Câu lệnh

;
04 sử dụng từ khóa
;
03, nhưng nó là một loại vòng lặp hoàn toàn khác so với vòng lặp
;
03 thông thường. Một vòng lặp
;
04 trông như thế này

delete o.x;
9

counter++;
74 thường đặt tên cho một biến, nhưng nó cũng có thể là một câu lệnh
;
4 khai báo một biến duy nhất.
counter++;
76 là một biểu thức đánh giá một đối tượng. Như thường lệ,
;
42 là câu lệnh hoặc khối câu lệnh đóng vai trò là phần thân của vòng lặp

Thật dễ dàng để sử dụng vòng lặp

;
03 thông thường để lặp qua các phần tử của một mảng

alert[greeting];
window.close[];
0

Vòng lặp

;
04 giúp dễ dàng thực hiện tương tự đối với các thuộc tính của đối tượng

alert[greeting];
window.close[];
1

Để thực thi câu lệnh

;
04, trước tiên, trình thông dịch JavaScript sẽ đánh giá biểu thức
counter++;
76, sau đó thực thi phần thân của vòng lặp một lần cho mỗi thuộc tính có thể đếm được của đối tượng kết quả. Tuy nhiên, trước mỗi lần lặp lại, trình thông dịch gán tên của thuộc tính cho
counter++;
74

Vòng lặp

;
04 không thực sự liệt kê tất cả các thuộc tính của một đối tượng, chỉ liệt kê các thuộc tính có thể đếm được [xem Thuộc tính thuộc tính]. Các phương thức tích hợp khác nhau được xác định bởi JavaScript lõi không thể đếm được. Ví dụ, tất cả các đối tượng đều có phương thức
counter++;
84, nhưng vòng lặp
;
04 không liệt kê thuộc tính
counter++;
86 này. Ngoài các phương thức dựng sẵn, nhiều thuộc tính khác của các đối tượng dựng sẵn là không thể đếm được. Tuy nhiên, tất cả các thuộc tính và phương thức được xác định bởi mã của bạn đều có thể đếm được. [Nhưng trong ECMAScript 5, bạn có thể làm cho chúng không thể đếm được bằng cách sử dụng các kỹ thuật được giải thích trong Thuộc tính thuộc tính. ]

Đặc tả ECMAScript không mô tả thứ tự vòng lặp

;
04 liệt kê các thuộc tính của một đối tượng. Tuy nhiên, trên thực tế, việc triển khai JavaScript từ tất cả các nhà cung cấp trình duyệt chính liệt kê các thuộc tính của các đối tượng đơn giản theo thứ tự mà chúng được xác định, với các thuộc tính cũ hơn được liệt kê trước. Nếu một đối tượng được tạo dưới dạng một đối tượng theo nghĩa đen, thì thứ tự liệt kê của nó giống như thứ tự mà các thuộc tính xuất hiện trong nghĩa đen. Lưu ý rằng thứ tự liệt kê này không áp dụng cho tất cả các đối tượng. Cụ thể, nếu một đối tượng bao gồm các thuộc tính chỉ mục mảng, các thuộc tính đó có thể được liệt kê theo thứ tự số thay vì theo thứ tự tạo

Một loại câu lệnh JavaScript khác là câu lệnh nhảy. Đúng như tên gọi, những thứ này khiến trình thông dịch JavaScript nhảy đến một vị trí mới trong mã nguồn. Câu lệnh

counter++;
12 làm cho trình thông dịch chuyển đến cuối vòng lặp hoặc câu lệnh khác.
counter++;
89 khiến trình thông dịch bỏ qua phần còn lại của vòng lặp và nhảy trở lại đầu vòng lặp để bắt đầu một lần lặp mới. JavaScript cho phép các câu lệnh được đặt tên hoặc gắn nhãn và
counter++;
12 và
counter++;
89 có thể xác định vòng lặp đích hoặc nhãn câu lệnh khác. Câu lệnh
counter++;
24 làm cho trình thông dịch chuyển từ lời gọi hàm trở lại mã đã gọi nó và cũng cung cấp giá trị cho lời gọi đó. Câu lệnh
counter++;
93 phát sinh hoặc âném,â một ngoại lệ và được thiết kế để hoạt động với câu lệnh
counter++;
94, câu lệnh này thiết lập một khối mã xử lý ngoại lệ

Bất kỳ câu lệnh nào cũng có thể được gắn nhãn bằng cách đặt trước nó một mã định danh và dấu hai chấm

alert[greeting];
window.close[];
2

Bằng cách gắn nhãn cho một câu lệnh, bạn đặt cho nó một cái tên mà bạn có thể sử dụng để chỉ nó ở nơi khác trong chương trình của bạn. Bạn có thể gắn nhãn cho bất kỳ câu lệnh nào, mặc dù chỉ hữu ích khi gắn nhãn cho các câu lệnh có phần thân, chẳng hạn như vòng lặp và điều kiện. Bằng cách đặt tên cho một vòng lặp, bạn có thể sử dụng các câu lệnh

counter++;
12 và
counter++;
89 bên trong phần thân của vòng lặp để thoát khỏi vòng lặp hoặc nhảy trực tiếp lên đầu vòng lặp để bắt đầu lần lặp tiếp theo.
counter++;
12 và
counter++;
89 là các câu lệnh JavaScript duy nhất sử dụng nhãn câu lệnh; . Dưới đây là ví dụ về vòng lặp
;
3 có nhãn và câu lệnh
counter++;
89 sử dụng nhãn

alert[greeting];
window.close[];
3

Câu lệnh

counter++;
12, được sử dụng một mình, khiến vòng lặp bao quanh trong cùng hoặc câu lệnh
;
46 thoát ngay lập tức. Cú pháp của nó rất đơn giản

alert[greeting];
window.close[];
4

Bởi vì nó khiến một vòng lặp hoặc

;
46 thoát ra, dạng câu lệnh
counter++;
12 này chỉ hợp lệ nếu nó xuất hiện bên trong một trong những câu lệnh này

Bạn đã thấy các ví dụ về câu lệnh

counter++;
12 trong câu lệnh
;
46. Trong các vòng lặp, nó thường được sử dụng để thoát sớm khi vì bất kỳ lý do gì, không cần phải hoàn thành vòng lặp nữa. Khi một vòng lặp có các điều kiện kết thúc phức tạp, việc thực hiện một số điều kiện này bằng các câu lệnh
counter++;
12 thường dễ dàng hơn là cố gắng diễn đạt tất cả chúng trong một biểu thức vòng lặp. Đoạn mã sau tìm kiếm các phần tử của một mảng cho một giá trị cụ thể. Vòng lặp kết thúc theo cách thông thường khi nó đến cuối mảng;

alert[greeting];
window.close[];
5

Mặc dù hiếm khi được sử dụng trong thực tế, JavaScript cho phép từ khóa

counter++;
12 được theo sau bởi một nhãn câu lệnh [chỉ là mã định danh, không có dấu hai chấm]

alert[greeting];
window.close[];
6

Khi

counter++;
12 được sử dụng với nhãn, nó sẽ nhảy đến cuối hoặc kết thúc câu lệnh kèm theo có nhãn được chỉ định. Đó là lỗi cú pháp khi sử dụng
counter++;
12 trong biểu mẫu này nếu không có câu lệnh kèm theo với nhãn được chỉ định. Với dạng câu lệnh
counter++;
12 này, câu lệnh được đặt tên không cần phải là một vòng lặp hoặc
;
46.
counter++;
12 có thể âthoát ra khỏiâ bất kỳ câu lệnh kèm theo nào

Câu lệnh

counter++;
89 tương tự như câu lệnh
counter++;
12. Tuy nhiên, thay vì thoát khỏi vòng lặp,
counter++;
89 khởi động lại vòng lặp ở lần lặp tiếp theo. Cú pháp của câu lệnh
counter++;
89 cũng đơn giản như câu lệnh
counter++;
12

alert[greeting];
window.close[];
7

Câu lệnh

counter++;
89 cũng có thể được sử dụng với nhãn

alert[greeting];
window.close[];
8

Câu lệnh

counter++;
89, ở cả dạng có nhãn và không có nhãn, chỉ có thể được sử dụng trong phần thân của vòng lặp. Sử dụng nó ở bất cứ nơi nào khác gây ra lỗi cú pháp

Ví dụ sau đây cho thấy một câu lệnh

counter++;
89 chưa được gắn nhãn đang được sử dụng để bỏ qua phần còn lại của vòng lặp hiện tại khi xảy ra lỗi

alert[greeting];
window.close[];
9

Giống như câu lệnh

counter++;
12, câu lệnh
counter++;
89 có thể được sử dụng ở dạng có nhãn của nó trong các vòng lặp lồng nhau, khi vòng lặp được khởi động lại không phải là vòng lặp kèm theo ngay lập tức

Nhớ lại rằng lời gọi hàm là các biểu thức và tất cả các biểu thức đều có giá trị. Câu lệnh

counter++;
24 trong một hàm chỉ định giá trị của các lệnh gọi của hàm đó. Đây là cú pháp của câu lệnh
counter++;
24

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
0

Câu lệnh

counter++;
24 chỉ có thể xuất hiện trong phần thân của hàm. Đó là một lỗi cú pháp để nó xuất hiện ở bất kỳ nơi nào khác. Khi câu lệnh
counter++;
24 được thực thi, hàm chứa nó sẽ trả về giá trị của
;
41 cho người gọi nó. Ví dụ

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
1

Không có câu lệnh

counter++;
24, một lời gọi hàm chỉ đơn giản là thực hiện lần lượt từng câu lệnh trong thân hàm cho đến khi đến cuối hàm, sau đó quay trở lại trình gọi của nó. Trong trường hợp này, biểu thức gọi có giá trị là
;
01. Câu lệnh
counter++;
24 cũng có thể được sử dụng mà không có
;
41 để làm cho hàm trả về
;
01 trước khi nó kết thúc phần thân của nó. Ví dụ

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
2

Ngoại lệ là tín hiệu cho biết đã xảy ra một số tình trạng ngoại lệ hoặc lỗi. Ném một ngoại lệ là báo hiệu một lỗi hoặc tình trạng ngoại lệ như vậy. Bắt một ngoại lệ là xử lý nó—thực hiện bất kỳ hành động nào cần thiết hoặc phù hợp để khôi phục từ ngoại lệ đó. Trong JavaScript, các ngoại lệ được đưa ra bất cứ khi nào xảy ra lỗi thời gian chạy và bất cứ khi nào chương trình đưa ra một cách rõ ràng bằng cách sử dụng câu lệnh

counter++;
93. Các ngoại lệ được phát hiện bằng câu lệnh
counter++;
94, được mô tả tiếp theo

Câu lệnh

counter++;
93 có cú pháp như sau

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
3

;
41 có thể đánh giá một giá trị thuộc bất kỳ loại nào. Bạn có thể đưa ra một số biểu thị mã lỗi hoặc một chuỗi chứa thông báo lỗi mà con người có thể đọc được. Lớp Lỗi và các lớp con của nó được sử dụng khi trình thông dịch JavaScript tự đưa ra lỗi và bạn cũng có thể sử dụng chúng. Đối tượng Lỗi có thuộc tính
delete o.x;
39 chỉ định loại lỗi và thuộc tính
delete o.x;
40 chứa chuỗi được truyền cho hàm tạo [xem lớp Lỗi trong phần tham khảo]. Đây là một hàm ví dụ ném ra một đối tượng Lỗi khi được gọi với một đối số không hợp lệ

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
4

Khi một ngoại lệ được đưa ra, trình thông dịch JavaScript ngay lập tức dừng thực thi chương trình bình thường và chuyển đến trình xử lý ngoại lệ gần nhất. Trình xử lý ngoại lệ được viết bằng cách sử dụng mệnh đề

delete o.x;
41 của câu lệnh
counter++;
94, được mô tả trong phần tiếp theo. Nếu khối mã mà ngoại lệ được đưa ra không có mệnh đề
delete o.x;
41 được liên kết, trình thông dịch sẽ kiểm tra khối mã kèm theo cao nhất tiếp theo để xem liệu nó có trình xử lý ngoại lệ được liên kết với nó không. Điều này tiếp tục cho đến khi một trình xử lý được tìm thấy. Nếu một ngoại lệ được ném vào một hàm không chứa câu lệnh
counter++;
94 để xử lý nó, thì ngoại lệ đó sẽ lan truyền đến mã đã gọi hàm đó. Theo cách này, các ngoại lệ lan truyền thông qua cấu trúc từ vựng của các phương thức JavaScript và lên ngăn xếp cuộc gọi. Nếu không tìm thấy trình xử lý ngoại lệ nào, thì ngoại lệ đó được coi là lỗi và được báo cáo cho người dùng

Câu lệnh

counter++;
94 là cơ chế xử lý ngoại lệ của JavaScriptâ. Mệnh đề
delete o.x;
46 của câu lệnh này chỉ đơn giản xác định khối mã có ngoại lệ sẽ được xử lý. Khối
delete o.x;
46 được theo sau bởi mệnh đề
delete o.x;
41, là một khối các câu lệnh được gọi khi một ngoại lệ xảy ra ở bất kỳ đâu trong khối
delete o.x;
46. Mệnh đề
delete o.x;
41 được theo sau bởi một khối
delete o.x;
51 chứa mã dọn dẹp được đảm bảo thực thi, bất kể điều gì xảy ra trong khối
delete o.x;
46. Cả khối
delete o.x;
41 và
delete o.x;
51 đều là tùy chọn, nhưng khối
delete o.x;
46 phải đi kèm với ít nhất một trong các khối này. Các khối
delete o.x;
46,
delete o.x;
41 và
delete o.x;
51 đều bắt đầu và kết thúc bằng dấu ngoặc nhọn. Các dấu ngoặc nhọn này là một phần bắt buộc của cú pháp và không thể bỏ qua, ngay cả khi một mệnh đề chỉ chứa một câu lệnh duy nhất

Đoạn mã sau minh họa cú pháp và mục đích của câu lệnh

counter++;
94

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
5

Lưu ý rằng từ khóa

delete o.x;
41 được theo sau bởi một mã định danh trong ngoặc đơn. Định danh này giống như một tham số chức năng. Khi một ngoại lệ bị bắt, giá trị được liên kết với ngoại lệ [ví dụ: đối tượng Lỗi] được gán cho tham số này. Không giống như các biến thông thường, mã định danh được liên kết với mệnh đề
delete o.x;
41 có phạm vi khối—nó chỉ được xác định trong khối
delete o.x;
41

Đây là một ví dụ thực tế của câu lệnh

delete o.x;
63. Nó sử dụng phương thức
delete o.x;
64 được xác định trong phần trước và các phương thức JavaScript phía máy khách
delete o.x;
65 và
delete o.x;
66 cho đầu vào và đầu ra

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
6

Phần này mô tả ba câu lệnh JavaScript còn lại—

delete o.x;
67,
delete o.x;
68 và
delete o.x;
69

Khi JavaScript tìm kiếm giá trị của một biến, trước tiên, nó sẽ xem xét các biến được xác định trong hàm hiện tại, sau đó [nếu hàm được lồng] vào các biến được xác định trong các hàm kèm theo và cuối cùng là các biến toàn cục. Câu lệnh

delete o.x;
67 tạm thời thay đổi cách tra cứu các biến bằng cách chỉ định một đối tượng có các thuộc tính sẽ được xử lý như thể chúng là các biến. Nó có cú pháp sau

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
7

Câu lệnh này thực thi

;
42 như thể nó là phần thân của một hàm lồng nhau và các thuộc tính của
counter++;
76 là các tham số được truyền cho hàm đó

Câu lệnh

delete o.x;
67 bị cấm ở chế độ nghiêm ngặt [xem âsử dụng nghiêm ngặtâ] và nên được coi là không dùng nữa ở chế độ không nghiêm ngặt. tránh sử dụng nó bất cứ khi nào có thể. Mã JavaScript sử dụng
delete o.x;
67 khó tối ưu hóa và có khả năng chạy chậm hơn nhiều so với mã tương đương được viết mà không có câu lệnh
delete o.x;
67

Câu lệnh

delete o.x;
68 thường không làm gì cả. Tuy nhiên, nếu một chương trình gỡ lỗi có sẵn và đang chạy, thì việc triển khai có thể [nhưng không bắt buộc] thực hiện một số loại hành động gỡ lỗi. Trong thực tế, tuyên bố này hoạt động như một điểm dừng. quá trình thực thi mã JavaScript dừng lại và bạn có thể sử dụng trình gỡ lỗi để in các giá trị của biếnâ, kiểm tra ngăn xếp cuộc gọi, v.v. Ví dụ: giả sử rằng bạn đang nhận được một ngoại lệ trong hàm
delete o.x;
77 vì nó đang được gọi với một đối số không xác định và bạn không thể biết cuộc gọi này đến từ đâu. Để giúp bạn gỡ lỗi vấn đề này, bạn có thể thay đổi
delete o.x;
77 để nó bắt đầu như thế này

{
    x = Math.PI;
    cx = Math.cos[x];
    console.log["cos[π] = " + cx];
}
8

Bây giờ, khi

delete o.x;
77 được gọi mà không có đối số, quá trình thực thi sẽ dừng lại và bạn có thể sử dụng trình gỡ lỗi để kiểm tra ngăn xếp cuộc gọi và tìm ra cuộc gọi không chính xác này đến từ đâu

Câu lệnh

delete o.x;
68 đã chính thức được thêm vào ngôn ngữ bởi ECMAScript 5, nhưng nó đã được các nhà cung cấp trình duyệt lớn triển khai trong một thời gian khá dài

delete o.x;
81 là một lệnh được giới thiệu trong ECMAScript 5. Chỉ thị không phải là tuyên bố [nhưng đủ gần để
delete o.x;
81 được ghi lại ở đây].
delete o.x;
81 không liên quan đến bất kỳ từ khóa JavaScript nào. nó chỉ đơn giản là một biểu thức ký tự chuỗi JavaScript và bị trình thông dịch ECMAScript 3 bỏ qua. Tuy nhiên, khi được đặt ở đầu tập lệnh hoặc phần thân hàm, nó có ý nghĩa đặc biệt đối với trình thông dịch ECMAScript 5

Mục đích của chỉ thị

delete o.x;
81 là để chỉ ra rằng mã theo sau [trong tập lệnh hoặc chức năng] là mã nghiêm ngặt. Mã nghiêm ngặt được thực thi trong chế độ nghiêm ngặt. Chế độ nghiêm ngặt của ECMAScript 5 là một tập hợp con bị hạn chế của ngôn ngữ giúp khắc phục một số lỗi ngôn ngữ quan trọng và cung cấp khả năng kiểm tra lỗi mạnh mẽ hơn cũng như tăng cường bảo mật. Sự khác biệt quan trọng nhất giữa chế độ nghiêm ngặt và chế độ không nghiêm ngặt là như sau

  • Câu lệnh

    delete o.x;
    67 không được phép ở chế độ nghiêm ngặt

  • Ở chế độ nghiêm ngặt, tất cả các biến phải được khai báo. một ReferenceError được đưa ra nếu bạn gán một giá trị cho một mã định danh không phải là biến, tham số hoặc thuộc tính được khai báo của đối tượng toàn cầu. [Ở chế độ không hạn chế, điều này ngầm khai báo một biến toàn cục bằng cách thêm một thuộc tính mới vào đối tượng toàn cục. ]

  • Ở chế độ nghiêm ngặt, các hàm được gọi dưới dạng hàm [chứ không phải là phương thức] có giá trị

    delete o.x;
    86 là
    ;
    01. [Ở chế độ không hạn chế, các hàm được gọi dưới dạng các hàm luôn được chuyển đối tượng toàn cục dưới dạng giá trị
    delete o.x;
    86 của chúng. ] Sự khác biệt này có thể được sử dụng để xác định xem việc triển khai có hỗ trợ chế độ nghiêm ngặt hay không

    {
        x = Math.PI;
        cx = Math.cos[x];
        console.log["cos[π] = " + cx];
    }
    9
  • Ở chế độ nghiêm ngặt, việc gán cho các thuộc tính không thể ghi và cố gắng tạo các thuộc tính mới trên các đối tượng không thể mở rộng sẽ gây ra TypeError. [Trong chế độ không hạn chế, những nỗ lực này không thành công. ] Tương tự, trong chế độ nghiêm ngặt, một nỗ lực xóa một thuộc tính không thể định cấu hình hoặc một giá trị không thuộc tính sẽ ném TypeError hoặc SyntaxError. [Ở chế độ không hạn chế, lần thử không thành công và biểu thức

    ;
    2 ước tính thành
    ;
    60. ]

  • Ở chế độ nghiêm ngặt, mã được chuyển đến

    delete o.x;
    91 không thể khai báo biến hoặc xác định hàm trong phạm vi của người gọi như trong chế độ không nghiêm ngặt. Thay vào đó, các định nghĩa hàm và biến nằm trong một phạm vi mới được tạo cho
    delete o.x;
    91. Phạm vi này bị loại bỏ khi
    delete o.x;
    91 trả về

  • Ở chế độ nghiêm ngặt, các số nguyên bát phân [bắt đầu bằng 0 không theo sau là x] không được phép. [Ở chế độ không hạn chế, một số triển khai cho phép các chữ số bát phân. ]

  • Ở chế độ nghiêm ngặt, số nhận dạng

    delete o.x;
    94 và
    delete o.x;
    95 được coi như từ khóa và bạn không được phép thay đổi giá trị của chúng

Chủ Đề