JavaScript:如果先执行var语句,那么为什么这不起作用?

JavaScript:如果先执行var语句,那么为什么这不起作用?,javascript,Javascript,我在JavaScript(Firefox 3.5、Windows XP)中尝试了以下内容: 输出为“PWN3D!”。为什么我的代码对我不利?我认为var name=value先执行。我不知道你所说的先执行的var语句是什么意思。您编写的代码看起来与我预期的完全一样: 创建了一个匿名函数 执行匿名函数,将foobar设置为“欢迎!” foobar变量设置为“PWN3D!” 将引发一个警报框,当前值为foobar,“PWN3D!” 您的alert语句会看到局部变量foobar,并警告其值,因为它在

我在JavaScript(Firefox 3.5、Windows XP)中尝试了以下内容:


输出为“PWN3D!”。为什么我的代码对我不利?我认为
var name=value先执行。

我不知道你所说的先执行的
var
语句是什么意思。您编写的代码看起来与我预期的完全一样:

  • 创建了一个匿名函数
  • 执行匿名函数,将
    foobar
    设置为“欢迎!”
  • foobar
    变量设置为“PWN3D!”
  • 将引发一个警报框,当前值为
    foobar
    ,“PWN3D!”

您的alert语句会看到局部变量foobar,并警告其值,因为它在作用域链上高于window.foobar。

来自(第87页):

带有初始值设定项的变量在执行VariableStatement时,而不是在创建变量时,分配其AssignmentExpression的值


因此,
var
会首先创建变量,但值(
'PWN3D!'
)会按照正常的执行顺序分配给它。

(在本例中,window.foobar和局部变量foobar恰好是同一件事,因为您处于执行的顶层。)此外,它会首先执行匿名函数,然后转到局部变量赋值“PWN3D!”,最后是将输出的警报,如您所见,“PWN3D!”。为了证明这一点,您可以插入
if('foobar'在窗口中){console.log(“Var foobar已声明但未初始化,其值为“+foobar”)
(function(){
    window.foobar = 'Welcome!';
})();

var foobar = 'PWN3D!';

alert(foobar);