2015-01-03 19 views
11

Tôi vừa xem qua mã nguồn ở đây: http://js-dos.com/games/doom2.exe.html và nhận thấy một vài điều:Mục đích của điều kiện eval này là gì?

if (typeof Module === 'undefined') 
{ 
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()'); 
} 
  • Chức năng Mô-đun được định nghĩa với một thẻ inline kịch bản
  • Nó sau đó được khai báo lại với var trong inline khác , lần này nó sẽ kiểm tra xem Module có tồn tại hay không.

Câu hỏi của tôi: điểm của tuyên bố Mô-đun với một chức năng cách gọi tự nếu nó chỉ sẽ cố gắng để trả lại Mô-đun lại là gì? Chẳng phải nó đã được chứng minh là nó không tồn tại sao? Tại sao không chỉ khai báo rõ ràng Mô-đun là {}?

+4

Mã này nằm trên github trong dự án emscripten. Nó đã được thêm vào trong cam kết này: https://github.com/kripken/emscripten/commit/22d510338239c1cf33136392c77a9b3d7d2ce2bc Họ đã di chuyển ra khỏi khai báo rõ ràng cho câu lệnh eval, nhưng thông điệp cam kết không rõ tại sao! Tôi đã thêm emscripten làm thẻ, sau đó một người nào đó từ dự án, hoặc ai biết rõ nó, có thể phát hiện ra nó và có thể giúp đỡ. – sifriday

Trả lời

5

typeof Module có thể không xác định nếu Mô-đun là biến cục bộ xảy ra có chứa undefined. Mã này có nghĩa là để hỗ trợ một vài trường hợp, Mô-đun có thể là cục bộ hoặc toàn cầu và được xác định hoặc không xác định. Chúng tôi muốn tránh gây ô nhiễm phạm vi toàn cầu, vì vậy chúng tôi không chỉ làm Module = ... nếu nó không được xác định.

Trước tiên, trường hợp thông thường là mã được tạo bằng emscripten trong phạm vi toàn cầu. Trong trường hợp này, Mô-đun có thể hoặc không thể được xác định và có thể là địa phương nhưng vẫn là undefined, vì vậy chúng tôi cần xử lý cả hai.

Thứ hai, mã emscripten có thể chỉ là một mô-đun, như trò chơi sử dụng ammo.js. Trong trường hợp đó, việc sử dụng là

function Ammo(Module) { 
    // emscripten-generated code, uses the Module 
    return something; 
} 

vì vậy Mô-đun trong trường hợp này là một hàm cục bộ, như một tham số đã được xác định cho chúng tôi.

Chúng tôi không thể chỉ khai báo var Module vì điều đó có nghĩa là Mô-đun là biến cục bộ. Vì vậy, chúng tôi cần eval. Đối với eval, chúng ta cần một hàm trả về một giá trị, bởi vì chúng ta cần một try-catch. Các try-catch sử dụng Module, và sẽ ném nếu Module không phải là một địa phương (bất kể nó có chứa undefined hay không), đó là chính xác những gì chúng ta muốn.

Có thể mã này có thể được đơn giản hóa!

+2

Vì bạn không đề cập đến nó, vì bản ghi: ** Alon là tác giả của những dòng đó. ** –

+2

Sự kết hợp giữa github và SO rất ấn tượng, hữu ích, để có thể đưa ra câu hỏi như thế này và tham gia nó lên đến cam kết và sau đó tác giả, người sau đó có thể trả lời câu hỏi. – sifriday

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