2013-03-31 15 views
1

从javascript.info:命名函数表达式和使用变量引用之间的区别?

function makeArmy() { 

    var shooters = [] 

    for(var i=0; i<10; i++) { 

    var shooter = function shoot() { 
     alert(shoot.i) 
    } 
    shooter.i = i 

    shooters.push(shooter) 
    } 

    return shooters 
} 

var army = makeArmy() 

army[0]() // 0 
army[1]() // 1 

有趣的部分:

var shooter = function shoot() { 
    alert(shoot.i) 
} 
shooter.i = i 

我的问题是:为什么下面不工作:

var shooter = function() { 
    alert(shooter.i) 
} 
shooter.i = i 

换句话说,为什么第一个按预期工作,而第二个不是?第一个(给函数本身一个名称并在函数内使用它)和第二个(使用引用该函数的变量)之间的实际区别是什么?

回答

1

你不能指变量shooter,直到其初始化表达式(function() {...})已完成。相反,如果你说

var shooter; 
shooter = function() { alert(shooter.i); } 

,因为变量已经声明,范围在函数表达式的计算点,将工作确定。

0

只是添加到史蒂夫说的。引用函数声明时,您会听到“悬挂”的字样。

在这个例子中,声明函数并不一定重要,因为当你的脚本被解析时,它首先会经过并查找所有的函数声明。

alert(fnDeclaration()); 
function fnDeclaration() { 
    return "It works!"; 
} 

在当你做一个函数表达式的情况下,你只能使用功能已分配,因为功能是在JavaScript中值后。

i.e. 
alert(fnDeclaration()); 
var fnDeclaration = function() { 
    return "It won't work :("; 
} 

这是两者之间差异的一般要旨。

相关问题