这很简单:JS 将变量声明提升到当前作用域的顶部,但是任何操作(包括赋值)都不会被提升(在同一作用域内,请参阅第二种情况说明),当然。所以你的片段被翻译成
(function()
{
var currentSize;//undefined
if (currentSize == 'hi')//always false
{
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined, of course
}());
通过省略 var,继续进行范围扫描(检查在全局范围内声明的变量)。可悲的是,这样做时,第一次使用 var 的上下文丢失了(在分支内),并且赋值也被提升了。一个隐含的全局被翻译为:
谢天谢地,这不是真的。我认为是这样,因为我在控制台中测试了一些似乎证实了这一点的东西。在这种情况下@amadan 是对的:您正在使用全局变量(greeting
当我发布此内容时错误地在您的代码段中调用)。我将留下下面的代码(更正它)以显示隐含的全局变量实际上是什么,希望它有助于某些人理解 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
}());