Có cách nào để kiểm tra xem chế độ nghiêm ngặt có được thực thi không?


76

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:


103

Thực tế là thisbê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

3
Để làm rõ, câu lệnh return tương đương với return this === undefined, nó không so sánh nó với đối tượng toàn cục, nó chỉ kiểm tra xem thiscó tồn tại hay không.
aljgom

26

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 evalkhông đưa một biến mới vào ngữ cảnh bên ngoài.


Chỉ vì tò mò, năm 2015 này chống đạn như thế nào, bây giờ ES6 lại ở đây?
John Weisz

3
Tôi xác minh rằng nó hoạt động trong ES6 trên chrome và nodejs mới nhất.
Michael Matthew Toomim

1
Đẹp! Hoạt động trong NodeJS 10 REPL có / không có --use_strictcờ.
igor

25
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


1
Điều này tốt hơn câu trả lời của Mehdi vì nó sẽ hoạt động ở mọi nơi, không chỉ trong phạm vi toàn cầu. Đã nâng lên. :)
mgol

7
Điều này dẫn đến lỗi cú pháp, xảy ra trước khi mã chạy, vì vậy nó không thể được bắt ...
xiên quay

5
Điều này cũng sẽ không hoạt động trong ES6 vì kiểm tra bị xóa để cho phép các tên thuộc tính được tính toán.
billc.cn

Tại sao lại xảy ra lỗi ở chế độ nghiêm ngặt?
Buksy

@skerit Bạn có thể giải thích thêm về lỗi cú pháp của mình không? Tôi không nhận được một.
Robert Siemer

12

Yep, this'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');
}

5

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 )
}

3

Cảnh báo + giải pháp phổ quát

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.


0

Một giải pháp khác có thể tận dụng thực tế là ở chế độ nghiêm ngặt, các biến được khai báo trong evalkhông được hiển thị trên phạm vi bên ngoài

function isStrict() {
    var x=true;
    eval("var x=false");
    return x;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.