2010-10-26 38 views
19

Với các đối tượng đặc biệt, tôi không hiểu những phần nào của đối tượng chạy trước khi khởi tạo, những gì chạy lúc khởi tạo và những gì chạy sau đó.Trong JavaScript, mã nào thực hiện khi chạy và mã nào thực hiện tại phân tích cú pháp?

EDIT: Dường như thời gian phân tích cú pháp là từ sai. Tôi đoán tôi nên đã xây dựng câu hỏi "Trong 2-pass đọc, những gì được đọc pass đầu tiên và những gì được đọc pass thứ hai?"

+0

Nó phụ thuộc vào mã của bạn. – SLaks

+1

Khi bạn hỏi về Javascript, bạn có đề cập cụ thể đến nó đang được sử dụng trong môi trường trình duyệt web không? – Spudley

+0

@Spudley, tôi không biết nó có thể được sử dụng trong bất kỳ môi trường nào khác, vì vậy có. – randomable

Trả lời

2

Không giống như C++, không thể chạy logic trong trình phân tích cú pháp Javascript.

Tôi nghi ngờ rằng bạn đang yêu cầu mã nào chạy ngay lập tức và mã nào chạy khi bạn tạo mỗi cá thể đối tượng.

Câu trả lời là bất kỳ mã nào trong hàm mà bạn gọi sẽ chỉ chạy khi bạn gọi hàm, trong khi bất kỳ mã nào bên ngoài hàm sẽ chạy ngay lập tức.

+0

Có cách nào để tạo một hàm trong đối tượng chạy khi đối tượng khởi tạo không? – randomable

+0

@Randomable: Loại đối tượng nào? Bạn có thể gọi hàm trong hàm tạo. – SLaks

+0

Được rồi, vậy bạn phải gọi nó? Không có cú pháp của việc tạo ra một chức năng mà làm cho nó tự động chạy? Tôi nghĩ rằng bạn vô tình trả lời câu hỏi của tôi ngay sau đó. – randomable

3

Trong khi tổ tiên trực tiếp của JavaScript là Lược đồ, JavaScript không kế thừa macro, vì vậy câu trả lời khá đơn giản: có không bao giờ bất kỳ mã nào chạy trong thời gian phân tích cú pháp.

+0

Bạn không có nghĩa là "Tự", không phải "Đề án"? Đó là nơi mà nó có được sự thừa kế nguyên mẫu từ đó. Nó thực sự không nhận được nhiều từ Scheme. – Pointy

25

Tệp javascript được chạy trong 2 lần đọc. Cú pháp phân tích cú pháp vượt qua đầu tiên và thu thập các định nghĩa hàm và lần truyền thứ hai thực sự thực thi mã. Điều này có thể được nhìn thấy bằng cách ghi nhận rằng đoạn mã sau hoạt động:

foo(); 

function foo() { 
    return 5; 
} 

nhưng sau không

foo(); // ReferenceError: foo is not defined 

foo = function() { 
    return 5; 
} 

Tuy nhiên, điều này không thực sự hữu ích để biết, vì không có thực hiện bất kỳ trong vượt qua đầu tiên. Bạn không thể sử dụng tính năng này để thay đổi logic của bạn cả.

+3

Nó rất hữu ích để biết, bởi vì tôi có thể dễ dàng đã viết mã trong ví dụ thứ hai của bạn và không hiểu tại sao nó không hoạt động. Ngoài ra, tôi đã không nhận ra rằng không có sự thi hành nào trong lần vượt qua đầu tiên, vì vậy bạn chắc chắn sẽ dọn dẹp mọi thứ cho tôi. – randomable

+0

@Gareth - còn khoảng var foo = function() {return 5;}) // undefined không phải là một hàm? –

+0

@GalMargalit Không, bạn sẽ nhận được lỗi cú pháp (dấu ngoặc đơn phụ). Nếu bạn đang nói về một IIFE bạn sẽ nhận được một lỗi không xác định. Điều này cũng được thực hiện trên thời gian chạy. – GuyT

4

Không chắc chắn những gì bạn hỏi chính xác vì vậy tôi sẽ chỉ chia sẻ những gì tôi biết.

Chức năng JavaScript được "tải trước" và được lưu trữ trong bộ nhớ của trình duyệt có nghĩa là khi bạn có chức năng được khai báo ở cuối trang và mã gọi nó ngay từ đầu, nó sẽ hoạt động. Lưu ý rằng các biến toàn cục, có nghĩa là bất kỳ biến nào được gán bên ngoài một hàm, không được tải trước, vì vậy chỉ có thể được sử dụng sau khi được khai báo.

Tất cả các lệnh bên ngoài một hàm sẽ được phân tích cú pháp theo thứ tự chúng xuất hiện.

JavaScript không thực sự có "thời gian chạy", nó chỉ có thể phản hồi các sự kiện hoặc có mã được thực thi qua bộ tính giờ toàn cầu. Bất kỳ mã nào khác sẽ được phân tích cú pháp và "bị lãng quên".

+0

'Biến toàn cục JavaScript, có nghĩa là bất kỳ biến nào được gán bên ngoài hàm, cũng được tải trước và có thể được sử dụng bằng mã bất kỳ ở đâu trong trang.' chúng ta có thể sử dụng nó trước khi nó được khởi tạo, cách chúng ta sử dụng hàm phân tích thời gian tức là' function foo() {} '? tôi nghĩ rằng không có .. biến toàn cầu chỉ có thể được sử dụng sau khi khởi tạo của nó. điều này sẽ không hoạt động 'console.log (a); var a = 20; ' –

+0

@LalZada hmm ... Tôi đã kiểm tra lại khi viết bài này, sẽ sớm kiểm tra lại. –

+0

@LalZada cũng thật đáng xấu hổ ... JS đã thay đổi hoặc tôi đã đăng bài này mà không kiểm tra trước. Đã chỉnh sửa, cảm ơn những người đứng đầu! :) –

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