2012-05-07 42 views

Trả lời

62

Thực tế là this bên trong một hàm gọi là trong bối cảnh toàn cầu sẽ không trỏ đến đối tượng toàn cầu có thể được sử dụng để phát hiện chế độ nghiêm ngặt:

var isStrict = (function() { return !this; })(); 

Demo:

> echo '"use strict"; var isStrict = (function() { return !this; })(); console.log(isStrict);' | node 
true 
> echo 'var isStrict = (function() { return !this; })(); console.log(isStrict);' | node 
false 
+0

vĩ đại. Điều này là thanh lịch và hoạt động ở khắp mọi nơi. –

+0

Để 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ầu, nó chỉ kiểm tra nếu' this' tồn tại. – aljgom

7

Yep, this'undefined' trong một phương pháp toàn cầu khi bạn ở chế độ nghiêm ngặt.

function isStrictMode() { 
    return (typeof this == 'undefined'); 
} 
18
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ã. Vì vậy, đây

+1

Điều này là tốt hơn so với câu trả lời của Mehdi vì nó sẽ làm việc ở khắp mọi nơi, không chỉ trong phạm vi toàn cầu. Upped. :) – 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ể bị bắt ... – skerit

+3

Điều này sẽ không hoạt động trong ES6 hoặc khi kiểm tra được loại bỏ để cho phép tên thuộc tính được tính toán. –

16

tôi thích một cái gì đó mà không sử dụng ngoại lệ và làm việc tại bất kỳ bối cảnh, không chỉ toàn cầu một:

var mode = (eval("var __temp = null"), (typeof __temp === "undefined")) ? 
    "strict": 
    "non-strict"; 

Nó sử dụng thực tế trong chế độ nghiêm ngặt eval không giới thiệu một biến mới vào bối cảnh bên ngoài.

+0

Chỉ cần ra khỏi tò mò, làm thế nào là chống đạn này trong năm 2015, bây giờ ES6 là ở đây? –

+2

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

+1

Thanh lịch và làm việc, cảm ơn bạn! – rudyryk

1

cách gửi thanh lịch: nếu "này" là đối tượng, 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) 
} 
Các vấn đề liên quan