2013-10-02 14 views
7

Đây là mã của tôi mà dường như để cho biết rằng câu trả lời là có - http://jsfiddle.net/4nKqu/Chế độ nghiêm ngặt ("sử dụng nghiêm ngặt";) được thừa hưởng bởi các chức năng như thế nào?

var Foo = function() { 
    'use strict' 
    return { 
     foo: function() { 
      a = 10 
      alert('a = ' + a) 
     } 
    } 
}() 

try { 
    Foo.foo() 
} catch (e) { 
    alert(e) 
} 

Ông có thể xin vui lòng trích dẫn các báo cáo từ các tiêu chuẩn mà làm rõ rằng 'use strict' được tự động áp dụng cho tất cả đóng cửa và chức năng được xác định trong vòng một chức năng để mà chúng tôi đã áp dụng 'use strict'?

+0

Bạn có thể muốn xem xét khai báo rõ ràng chế độ nghiêm ngặt trong mọi chức năng, nếu không, nó sẽ để lại chỗ cho lỗi khi mã đang được tái cấu trúc. –

Trả lời

8

Phần liên quan của spec:

http://www.ecma-international.org/ecma-262/5.1/#sec-10.1.1

mà nói:

Code is interpreted as strict mode code in the following situations: 
  • đang toàn cầu là mã toàn cầu nghiêm ngặt nếu nó bắt đầu với một Prologue Chỉ có chứa Chỉ Thị Sử Dụng Nghiêm Ngặt (xem 14.1).

  • Eval code đang nghiêm ngặt đang eval nếu nó bắt đầu với một Prologue Chỉ có chứa một Sử dụng Chỉ thị nghiêm ngặt hoặc nếu cuộc gọi để eval là lời kêu gọi trực tiếp (xem 15.1.2.1.1) đến hàm eval đó là chứa trong mã chế độ nghiêm ngặt.

  • đang

    Chức năng này sẽ là một phần của một FunctionDeclaration, FunctionExpression, hoặc các phụ kiện PropertyAssignment là chặt chẽ chức năng mã nếu FunctionDeclaration của nó, FunctionExpression, hoặc PropertyAssignment được chứa trong mã chế độ nghiêm ngặt hoặc nếu mã chức năng bắt đầu với một Chỉ thị Prologue có chứa Chỉ thị sử dụng nghiêm ngặt .

  • đang

    Chức năng này sẽ được cung cấp như là đối số cuối cùng được xây dựng trong constructor Chức năng là nghiêm ngặt mã chức năng nếu đối số cuối cùng là một String rằng khi xử lý như một FunctionBody bắt đầu với một Chỉ thị Prologue có chứa một Sử dụng nghiêm ngặt Chỉ thị.

Vì vậy, cho các chức năng được xác định một cách rõ ràng trong vòng một 'phạm vi nghiêm ngặt', họ sẽ thừa hưởng chế độ nghiêm ngặt:

function doSomethingStrict(){ 
    "use strict"; 

    // in strict mode 

    function innerStrict() { 
     // also in strict mode 
    } 
} 

Nhưng chức năng tạo ra bằng cách sử dụng constructor Function không kế thừa chế độ nghiêm ngặt từ bối cảnh của họ, vì vậy phải có tuyên bố rõ ràng "use strict"; nếu bạn muốn chúng ở chế độ nghiêm ngặt. Ví dụ, lưu ý rằng eval là một từ khóa dành riêng trong chế độ nghiêm ngặt (nhưng không phải bên ngoài của chế độ nghiêm ngặt):

"use strict"; 

var doSomething = new Function("var eval = 'hello'; console.log(eval);"); 

doSomething(); // this is ok since doSomething doesn't inherit strict mode 
2

Câu trả lời là có, nhưng có thể bạn sẽ không tìm thấy câu chính xác trong các tài liệu, thay vào đó nó nói về bối cảnh. Khi bạn xác định hàm Foo bên trong một hàm khác Bar, Foo được tạo trong ngữ cảnh Bar. Nếu ngữ cảnh của Bar ở chế độ nghiêm ngặt, điều đó có nghĩa là ngữ cảnh của Foo ở chế độ nghiêm ngặt.

Bạn có thể nhìn vào tài liệu ở đây: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

Nếu bạn nghĩ về nó, không có hành vi đó sẽ thực sự không thực tế (và không có nhược điểm thực sự đối với nó).

này cũng rất hữu ích để làm cho toàn bộ thư viện của bạn sử dụng chế độ nghiêm ngặt mà không cần bất kỳ vấn đề trong trường hợp nối của một số kịch bản:

Bạn cũng có thể tiếp cận các gói toàn bộ nội dung của một kịch bản trong một chức năng và có chức năng bên ngoài sử dụng chế độ nghiêm ngặt.

Các vấn đề liên quan