2011-12-16 48 views

回答

4

您的代码具有误导性,风格使人们认为执行顺序很重要。标准的JavaScript引擎这些天将采取和重新格式化之前运行它:

var a = 1, 
b = function() { 
    var a = function() {}; 
    a = 10; 
    return; 
}; 
b(); 
alert(a); 

现在你可以了解到底发生了什么。在函数“b”中再次声明“a”,所以实际上现在有两个“a”变量。一个是“window.a”,另一个是“b var a”,但不是“b.a”,因为它不能在闭包或函数之外访问。

换句话说,你得到你的代码。

请让您的代码易读并且不要混淆这一观点。

6

在函数中用最后一行声明符号“a”。这是受转让声明影响的“a”。

函数声明语句被悬挂到函数的顶部并首先被解释。因此,赋值语句在之后有效地发生,您已经声明了一个名为“a”的函数(局部于“b”函数)。因此,该作业影响符号,而不是全球“a”。

请记住,变量不是键入的,因此您将名称绑定到函数的事实不会阻止它稍后被赋值为数值。

+0

哇。这是javascript可爱的灵活性的一个很好的例子,如果你不小心如何编写它,麻烦会让你陷入困境。 – 2011-12-16 22:33:20

+1

是的!简单明了的JavaScript使它变得复杂:-) – Pointy 2011-12-16 22:35:08