Vẫn có cách nào để kiểm tra xem chế độ nghiêm ngặt 'sử dụng nghiêm ngặt' có được thực thi hay không và chúng tôi muốn thực thi mã khác cho chế độ nghiêm ngặt và mã khác cho chế độ không nghiêm ngặt. Tìm kiếm chức năng nhưisStrictMode();//boolean
Vẫn có cách nào để kiểm tra xem chế độ nghiêm ngặt 'sử dụng nghiêm ngặt' có được thực thi hay không và chúng tôi muốn thực thi mã khác cho chế độ nghiêm ngặt và mã khác cho chế độ không nghiêm ngặt. Tìm kiếm chức năng nhưisStrictMode();//boolean
Câu trả lời:
Thực tế là this
bên trong một hàm được gọi trong ngữ cảnh toàn cục sẽ không trỏ đến đối tượng toàn cục có thể được sử dụng để phát hiện chế độ nghiêm ngặt:
var isStrict = (function() { return !this; })();
Bản giới thiệu:
> echo '"use strict"; var isStrict = (function() { return !this; })(); console.log(isStrict);' | node
true
> echo 'var isStrict = (function() { return !this; })(); console.log(isStrict);' | node
false
Tôi thích thứ gì đó không sử dụng ngoại lệ và hoạt động trong mọi ngữ cảnh, không chỉ toàn cầu:
var mode = (eval("var __temp = null"), (typeof __temp === "undefined")) ?
"strict":
"non-strict";
Nó sử dụng thực tế là ở chế độ nghiêm ngặt eval
không đưa một biến mới vào ngữ cảnh bên ngoài.
--use_strict
cờ.
function isStrictMode() {
try{var o={p:1,p:2};}catch(E){return true;}
return false;
}
Có vẻ như bạn đã có câu trả lời. Nhưng tôi đã viết một số mã. Nên ở đây
Yep, this
là 'undefined'
trong vòng một phương pháp toàn cầu khi bạn đang ở trong chế độ nghiêm ngặt.
function isStrictMode() {
return (typeof this == 'undefined');
}
Cách thanh lịch hơn: nếu "this" là đối tượng, hãy chuyển đổi nó thành true
"use strict"
var strict = ( function () { return !!!this } ) ()
if ( strict ) {
console.log ( "strict mode enabled, strict is " + strict )
} else {
console.log ( "strict mode not defined, strict is " + strict )
}
Nhiều câu trả lời ở đây khai báo một hàm để kiểm tra chế độ nghiêm ngặt, nhưng một hàm như vậy sẽ không cho bạn biết gì về phạm vi mà nó được gọi, chỉ phạm vi mà nó được khai báo!
function isStrict() { return !this; };
function test(){
'use strict';
console.log(isStrict()); // false
}
Tương tự với các lệnh gọi thẻ tập lệnh chéo.
Vì vậy, bất cứ khi nào bạn cần kiểm tra chế độ nghiêm ngặt, bạn cần viết toàn bộ kiểm tra trong phạm vi đó:
var isStrict = true;
eval("var isStrict = false");
Không giống như câu trả lời được ủng hộ nhiều nhất, lần kiểm tra này của Yaron không chỉ hoạt động trong phạm vi toàn cầu.
return this === undefined
, nó không so sánh nó với đối tượng toàn cục, nó chỉ kiểm tra xemthis
có tồn tại hay không.