2012-10-21 29 views
10

Tôi hiện đang triển khai một số bản sửa lỗi cho bản nháp ES6. Tôi tự hỏi nếu có ai có thể cho tôi biết những gì có nghĩa là ReturnIfAbrupt. Ví dụ, thực hiện của tôi cho Number.toInt (trong đó kêu gọi nội [[ToInteger]] là như sau:.ReturnIfAbrupt có nghĩa là gì trong bản dự thảo ES6?

if (!('toInt' in Number)) 
    Object.defineProperty(Number, 'toInt', { 

     value: function toInt(value) { 
      // ECMA-262 Ed. 6, 9-27-12. 9.1.4 

      // 1. Let number be the result of calling ToNumber on the input argument. 
      var number = Number(value); 

      // 2. ReturnIfAbrupt(number). 
      // ? 

      // 3. If number is NaN, return +0. 
      if (number != number) return 0; 

      // 4. If number is +0, -0, +Infinity, or -Infinity, return number. 
      if (number == 0 || 1/number == 0) return number; 

      // 5. Return the result of computing sign(number) * floor(abs(number)). 
      return (n < 0 ? -1 : 1) * Math.floor(Math.abs(number)); 

     }, 

     writable: true, 
     configurable: true 

    }); 

Bước 2 là ReturnIfAbrupt(number) Bạn sẽ nhận thấy tôi hiện đang có // ? cho bước đó vì tôi không chắc chắn những gì để làm gì. có nghĩa là khi nó nói ReturnIfAbrupt(...)?

tôi đã đọc phần trên ReturnIfAbrupt trong dự thảo, tuy nhiên tôi không thể hiểu được những gì để làm cho bước 2, những gì để đặt vào vị trí của // ? trong đoạn code trên.

Từ đọc sách của tôi, có thể không có gì phải làm và bước ReturnIfAbrupt chỉ có nghĩa là để cho bất kỳ lỗi nào xảy ra trong ToNumber để truyền bá, thoát khỏi hàm. Tuy nhiên, điều đó có vẻ quá dài dòng, như tôi nghĩ nó có thể đi mà không nói. Ngoài ra, nó không có vẻ như tôi như ToNumber thậm chí có thể ném một lỗi. Ai đó có thể xác nhận hoặc giúp tôi hiểu ý nghĩa thực sự?

+0

Dưới đây là một điểm khởi đầu: http: //people.mozilla .org/~ jorendorff/es6-draft.html # sec-8.8.4 –

+1

Vâng, tôi đã đọc rồi. Nó không có ý nghĩa hoàn toàn với tôi, nhưng từ những gì tôi có thể tạo ra, có vẻ như tôi không thực sự làm gì trong bước đó, và nếu một lỗi được đưa ra bởi 'ToNumber' ở bước 1 thì nên được nhân giống và chức năng nên thoát. Tuy nhiên, tôi không thực sự hiểu tại sao điều đó lại cần bước riêng của nó, vì nó phải được hiểu. Nếu đúng như vậy, tôi muốn xác nhận. Nếu không phải vậy, tôi cần giúp đỡ. –

+0

Cách diễn giải của bạn có vẻ đúng. Có thể có một số chi tiết mà tôi đang thiếu, nhưng phần quan trọng sẽ là ném một ngoại lệ trở lại trong trường hợp lỗi trong các loại coversion tôi đoán. –

Trả lời

6

ReturnIfAbrupt đề cập đến việc hoàn thành đột ngột. Bản ghi hoàn thành chứa một loại và giá trị được liên kết với nó. Một hoàn thành bình thường sẽ là một cái gì đó giống như giá trị kết quả của một biểu thức. Hoàn thành trả lại từ một hàm là hoàn thành dự kiến ​​thông thường ngoài việc hoàn thành bình thường. Bất kỳ loại hoàn thành nào khác đều bị đột ngột. Đó là ném, phá vỡ, tiếp tục.

if (isCompletionRecord(v)) { 
    if (isAbruptCompletion(v)) { 
    return v; 
    } else { 
    v = v.value; 
    } 
} 

Thực hiện như bạn đang có, những gì nó sẽ đòi hỏi là gói hàm trong một lần thử. Một giá trị ném sẽ là một sự hoàn thành đột ngột. Đây không phải là một cái gì đó bạn thấy ở cấp JS mặc dù, nó là để thực hiện kiểm soát dòng chảy và chuyển giao kiểm soát phi địa phương ở cấp độ động cơ.

Tôi đã thực hiện nhiều spec ES6 trong một máy ảo JS mà cũng có thể giúp làm sáng tỏ về nó, đây là ToInteger: https://github.com/Benvie/continuum/blob/master/lib/continuum.js#L516

function ToInteger(argument){ 
    if (argument && typeof argument === OBJECT && argument.IsCompletion) { 
    if (argument.IsAbruptCompletion) { 
     return argument; 
    } 
    argument = argument.value; 
    } 
    return ToNumber(argument) | 0; 
} 
+1

Cảm ơn! Vì vậy, đối với tôi, nó thực tế có nghĩa là "không làm gì cả". Có vẻ lạ với tôi. Có thể 'ToNumber' thậm chí dẫn đến kết thúc đột ngột không? Nó không có vẻ như vậy. –

+1

Ngoài ra, sửa tôi nếu tôi sai, nhưng từ việc đọc bản nháp tôi đang sử dụng (9-27-12), tôi nghĩ 'ToInteger' này có thể không chính xác 100% do 'ToNumber (đối số) | Dòng 0'. Điều đó không phải luôn luôn dẫn đến một số hữu hạn? Dự thảo dường như chỉ ra 'ToInteger' có thể dẫn đến các giá trị vô hạn. –

+0

Nó có nghĩa là không làm gì trừ khi bạn nhận được một ném. Hãy suy nghĩ về nó frmo góc của "không có cố gắng bắt". Một cách để thực hiện try..catch là thực hiện chính xác những gì spec đó thực hiện. Quay trở lại "ném" như kết quả bình thường, nhưng bọc như một loại "ThrownValue" và luôn luôn kiểm tra nó. Hầu hết thời gian bạn không phải làm bất cứ điều gì. Nhưng nếu đó là kết quả đặc biệt thì bạn cần phải vượt qua nó mà không cần sửa đổi. Để điều ToInteger, thực sự bạn là đúng.Tôi sắp xếp một số các nhà khai thác trong dự đoán của một vượt qua thứ hai để xem chi tiết. –