2010-10-18 28 views
5

Việc sản xuất VariableStatement:ngữ nghĩa VariableStatement trong ECMAScript

var VariableDeclarationList ; 

được đánh giá như sau:

  1. Đánh giá VariableDeclarationList.
  2. Trả lại (normal, empty, empty).

Tôi muốn biết về ý nghĩa của bình thường và trống.

Trả lời

7

ECMAScript mô tả loại nội bộ để giải thích hành vi của câu lệnh, được gọi là The Completion Specification Type.

Giá trị của các loại Hoàn là gấp ba trong những hình thức (type, value, target), trong đó:

  • type có thể normal, break, continue, return, hoặc throw.
  • value có thể là bất kỳ giá trị ngôn ngữ nào hoặc empty.
  • target có thể là bất kỳ Identifier hoặc empty.

Trong trường hợp của VariableStatement, kết thúc trở lại đã không có tác dụng quan sát được, nó là một bình thường hoàn, vì dòng chảy kiểm soát không được sửa đổi.

Báo cáo khác trả lại số hoàn thành bình thường, ví dụ: một sản phẩm nào Block statement, các Empty Statement, các ExpressionStatement, các debugger statement (khi không có debugger đính kèm), vv ...

Một FunctionDeclaration (mà không phải là một tuyên bố, nhưng một SourceElement) cũng trả về một kết thúc (normal, empty, empty), đó là lý do tại sao ví dụ :

eval("function f(){}"); // returns undefined 

các eval function sau khi thực thi mã, kiểm tra kết quả hoàn thành, và nếu gõ là normal và giá trị là empty, nó rõ ràng sản xuất undefined (xem bước 7 của eval), trong khi đó:

eval("(function f(){})"); // returns a function object 

Có ngoặc xây dựng một PrimaryExpression, mà là một phần của một ExpressionStatement, và tuyên bố này trả về hoàn (normal, GetValue(exprRef), empty), nơi expRef sẽ là giá trị của FunctionExpression.

Nếu hoàn thành type nếu khác hơn normal còn được gọi là "hoàn thành đột ngột".

Ví dụ:

function foo() { 
    return 5; 
} 
foo(); 

Các return tuyên bố bên foo sẽ tạo ra một kết thúc giống như (return, 4, empty).

Giá trị target trong bộ ba chỉ được sử dụng bởi breakcontinue, để tham khảo một định danh của một LabelledStatement, ví dụ:

foo: while(true) { 
    while(true) { 
    break foo; 
    } 
} 

Việc hoàn thành kết quả của break tuyên bố trên sẽ (break, empty, foo), vì dòng chảy kiểm soát được chuyển từ bên trong số while thứ hai sang bên ngoài, ở cấp nhãn foo.

Bạn có thể xem chi tiết hơn về cách loại nội này được sử dụng, trên tất cả các báo cáo khác mà thực hiện không cục bộ chuyển tầm kiểm soát như break, continue, returnthrow.

+0

Cảm ơn sự giúp đỡ của bạn – okjungsoo