Bạn đang hỏi về khái niệm khác nhau mà không liên quan rất chặt chẽ. Tôi sẽ cố gắng giải quyết một cách ngắn gọn.
Thực hiện bối cảnh là một khái niệm trong spec ngôn ngữ mà — trong điều khoản của layman — khoảng tương đương với các 'môi trường' một chức năng thực hiện trong; có nghĩa là, phạm vi biến (và chuỗi phạm vi , các biến trong bao đóng từ phạm vi bên ngoài), đối số chức năng và giá trị của đối tượng this
.
Ngăn xếp cuộc gọi là tập hợp các ngữ cảnh thực thi.
Xem thêm this answer và this article.
Phạm vi là nghĩa đen rằng: phạm vi trong đó một biến thể được truy cập. Đơn giản:
var x;
function a() {
var y;
}
x
có thể được truy cập từ mọi nơi. Khi a
được gọi, x
sẽ nằm trong phạm vi bên ngoài. (Lưu trữ trong chuỗi phạm vi.)
Ngược lại, y
chỉ có thể được truy cập bằng mã trong a()
bởi vì nó được giới hạn trong phạm vi a
's. Đây là những gì từ khóa var
thực hiện: hạn chế một biến cho phạm vi cục bộ. Nếu chúng tôi bỏ qua var
, y
sẽ kết thúc trong phạm vi toàn cầu toàn cầu, thường được coi là điều xấu.
Hãy suy nghĩ về cẩu như nhiều hơn một điều thời gian biên dịch. Trong JavaScript, chức năng khai báo được "treo" lên đầu phạm vi của chúng. Nói cách khác, chúng được phân tích cú pháp và đánh giá trước bất kỳ mã nào khác. (Điều này trái với hàm biểu thức, được đánh giá nội dòng.) Hãy xem xét những điều sau đây:
a();
b();
function a() { }
var b = function() { }
Cuộc gọi đến a()
sẽ thành công vì tuyên bố của nó được nâng lên đỉnh; a
được gán tự động trước khi bắt đầu thực hiện chương trình. Các cuộc gọi đến b()
sẽ thất bại với một TypeError
vì b
sẽ không được xác định cho đến khi dòng 4.
Bạn có thể cần xác định ** Ngữ cảnh thực thi ** – jondavidjohn
@jondavidjohn: * Ngữ cảnh thực thi * có ý nghĩa cụ thể trong [ECMA-262] (http://bclary.com/2004/11/07/#a- 10). – josh3736
@ josh3736 cảm ơn! – jondavidjohn