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
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. –