sách gpt4 ai đã đi

Công cụ Javascript thực thi Javascript trong trình duyệt như thế nào?

In lại Tác giả: Data Little Sun Thời gian cập nhật: 2023-10-29 04:09:06 35 4
mua khóa gpt4 Nike

Đặt câu hỏi không phải để giải quyết vấn đề mà để hiểu rõ hơn về hệ thống

Chuyên gia! Tôi biết rằng bất cứ khi nào bạn nhập mã javascript vào công cụ javascript, nó sẽ được công cụ javascript thực thi ngay lập tức. Vì tôi chưa đọc mã nguồn của Engine nên tôi có những câu hỏi sau:

Giả sử tôi đang tải một vài tệp từ máy chủ từ xa, cụ thể là FILE_1.js và FILE_2.js. Mã trong FILE_2.js yêu cầu một số mã từ FILE_1.js. Vì vậy, tôi đã bao gồm tập tin như sau,



Hy vọng là tôi đã hoàn thành yêu cầu về công cụ Javascript. Thật không may, tôi đã viết 5000KB mã trong FILE_1.js, nhưng tôi chỉ có 5KB mã trong FILE_2.js. Vì máy chủ đa luồng nên FILE_2.js chắc chắn sẽ tải trong trình duyệt của tôi trước khi FILE_1.js hoàn tất.

Các công cụ JavaScript xử lý việc này như thế nào?

Nếu bạn di chuyển mã từ FILE_2.js sang thẻ inline-script như sau, thì công cụ javascript sẽ thực hiện những bước nào để quản lý sự phụ thuộc này?



LƯU Ý: Tôi không mong đợi những câu trả lời chỉ có một từ. Tôi chỉ muốn biết thêm thông tin về việc ai đang quản lý các yêu cầu được thực hiện bởi trình duyệt hay công cụ JavaScript hay chỉ là người dùng trung bình? Nếu yêu cầu/phản hồi được xử lý bởi con người bình thường, thì công cụ javascript thực hiện điều này bằng cách nào?

1 Câu trả lời

Khi tôi đăng câu trả lời về hành vi mã, có hai nơi tôi luôn muốn đến:

  1. đặc điểm kỹ thuật
  2. hoàn thành

đặc điểm kỹ thuật:

DOM API chỉ rõ rằng các tập lệnh phải được thực thi theo thứ tự:

Nếu phần tử có thuộc tính src, không có thuộc tính async và không có cờ "force-async" được đặtPhần tử phải được thêm vào cuối danh sách các tập lệnh sẽ được thực hiện theo thứ tự sớm nhất có thể được liên kết với Tài liệu của phần tử tập lệnh tại thời điểm thuật toán chuẩn bị tập lệnh bắt đầu.

Từ 4.1 Viết kịch bản .Vui lòng kiểm tra danh sách ngoại lệ cho quy tắc này trước - với hoãn lại hoặc không đồng bộ tài sản. Đây là 4.12.1.15 Hướng dẫn chi tiết được đưa ra trong . .

Hãy tưởng tượng điều này có ý nghĩa:

 //TẬP_TIN_1.js
var trololo = "Kỳ lân";
....
// 1 triệu dòng sau
trololo = "kỳ lân";
var message = "Xin chào thế giới";
//TẬP_TIN_2.js
alert(message); // nếu tệp 1 không được thực thi trước, lệnh này sẽ báo lỗi tham chiếu.

Thông thường, tốt hơn là sử dụng trình tải mô-đun (trình này sẽ trì hoãn việc chèn và thực thi tập lệnh và sẽ quản lý các phụ thuộc một cách phù hợp cho bạn).

Hiện tại, cách tốt nhất để làm điều này là sử dụng thứ gì đó như Trình duyệt phương pháp. hoặc Yêu cầuJS Trong tương lai chúng ta sẽ có thể sử dụng các mô-đun ECMAScript 6.

hoàn thành:

Vâng, bạn đã nhắc đến điều đó và tôi không thể cưỡng lại được. Vì vậy, nếu chúng ta kiểm tra Chớp chớp CromNguồn (vẫn tương tự trong WebKit):

bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, 
LegacyTypeSupport hỗ trợLegacyTypes)
{
.....
} else if (client->hasSourceAttribute() && // có thuộc tính src
!client->asyncAttributeValue() && // và không có `async` hoặc `defer`
!m_forceAsync // và nó không bị ép buộc theo cách khác
) { // - woah, điều này giống hệt như thông số kỹ thuật
m_willExecuteInOrder = true; // yêu cầu thực thi theo thứ tự
contextDocument->scriptRunner()->queueScriptForExecution(cái này,
m_tài nguyên,
ScriptRunner::IN_ORDER_EXECUTION);

Tuyệt, vì vậy chúng ta có thể thấy trong mã nguồn rằng nó thêm chúng theo thứ tự phân tích cú pháp - giống như thông số kỹ thuật đã nêu.

Chúng ta hãy xem thế nào chạy kịch bản làm :

void ScriptRunner::queueScriptForExecution(ScriptLoader* scriptLoader,
Tài nguyên ResourcePtr,
Loại thực thi Loại thực thi){
.....
// Thêm nó vào thứ tự thực hiện, như chúng ta có thể thấy, điều này chỉ
// thêm nó vào hàng đợi
trường hợp IN_ORDER_EXECUTION:
m_scriptsToExecuteInOrder.append(PendingScript(phần tử, resource.get()));
phá vỡ;
}

Và, bằng cách sử dụng bộ hẹn giờ, nó sẽ kích hoạt từng mục một khi chúng đã sẵn sàng (hoặc ngay lập tức, nếu không có mục nào đang chờ xử lý):

 void ScriptRunner::timerFired(Timer* bộ đếm thời gian)
{
...
scripts. hoán đổi(m_scriptsToExecuteSoon);
đối với (size_t i = 0; i < size; ++i) {
....
//ngọn lửa!
toScriptLoaderIfPossible(phần tử.get())->execute(tài nguyên);
m_document->decrementLoadEventDelayCount();
}

Công cụ Javascript thực thi Javascript trong trình duyệt như thế nào? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/22105343/

35 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com