Nó rất đơn giản: JS Palăng tờ khai Biến để phía trên cùng của phạm vi hiện tại, nhưng bất kỳ hoạt động (bao gồm cả nhiệm vụ) không hoisted (trong cùng một phạm vi, xem giải thích trường hợp thứ hai), tất nhiên. Vì vậy, đoạn mã của bạn được dịch sang
(function()
{
var currentSize;//undefined
if (currentSize == 'hi')//always false
{
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined, of course
}());
Bằng cách bỏ qua var, tiến hành quét phạm vi (kiểm tra biến được khai báo trong phạm vi toàn cục).
Đáng buồn thay, khi làm như vậy, bối cảnh của việc sử dụng đầu tiên của var bị mất (bên trong một nhánh), và nhiệm vụ được hoisted, quá. Toàn cầu ngụ ý được dịch sang số
:
Cảm ơn Chúa, điều này không đúng. Tôi cho rằng đó là vì tôi đã thử nghiệm một vài thứ trong bảng điều khiển dường như chứng thực điều này. Trong trường hợp này @amadan là đúng: bạn đang sử dụng biến toàn cục (được gọi là greeting
trong đoạn trích của bạn do nhầm lẫn khi tôi đăng bài này). Tôi sẽ để lại mã dưới đây (sửa chữa nó) để hiển thị những gì globals ngụ ý thực sự, hy vọng nó sẽ giúp ai đó đôi khi trong việc hiểu phạm vi/phạm vi quét trong JS.
var currentSize = 'hello';
//well, actually implied globals can be deleted, so it's more like
Object.defineProperty(this,'currentSize',{value:undefined,
writable:true,
enumerable:true,
configurable:true});
(function()
{
if (currentSize == 'hi')//always false
{//this still doesn't get executed
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined
}());
Nguồn
2012-11-29 12:53:05
+1 Câu trả lời rõ ràng và rõ ràng. – Aesthete
+1 thực sự dành cho bạn thưa bạn. –
@bfavaretto: Tôi giả định 'var greeting' là một lỗi, và được cho là khai báo biến toàn cầu' var currentSize' (sẽ bị lu mờ trong ví dụ đầu tiên, và được sử dụng trong ví dụ thứ hai). Nếu không nó sẽ hoàn toàn không liên quan đến ví dụ. – Amadan