Thứ lỗi cho tôi nếu đây là cách tiếp cận sai để thêm điểm. Tôi đã không ở đây nhiều, và sẽ hoan nghênh sự chỉ đạo và / hoặc chỉ trích mang tính xây dựng.
Câu trả lời của Benjamin giải quyết câu hỏi của OP một cách xuất sắc, nhưng tôi muốn thêm một điều chỉnh sẽ cho chúng ta một chuyến tham quan đầy đủ về việc nâng cẩu và những điều kỳ lạ của nó.
Nếu chúng ta bắt đầu mã gốc bằng lệnh gọi tới f
, như sau:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Đầu ra sau đó sẽ là:
Me duplicate.
Me original.
Lý do là var
và các function
tuyên bố được lưu trữ theo những cách hơi khác nhau.
Đối với var
các tờ khai được chuyển đến phía trên của phạm vi * hiện tại, nhưng bất kỳ chuyển nhượng không được kéo lên. Theo như giá trị của var đã khai báo, nó không được xác định cho đến khi đạt đến dòng gán ban đầu.
Đối với các function
câu lệnh , cả khai báo và định nghĩa đều được lưu trữ. Biểu thức hàm , như được sử dụng trong var f = function() {...
cấu trúc, không được nâng lên.
Vì vậy, sau khi lưu trữ, việc thực thi giống như mã là:
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
* Tất cả phạm vi JavaScript đều là từ vựng, hoặc hàm, phạm vi, nhưng có vẻ như nó sẽ khiến mọi thứ nhầm lẫn khi sử dụng từ f vào thời điểm đó.