2013-05-28 52 views

回答

6

由于变量提升,订单解释如下所示。请注意,正如@ShadowCreeper正确指出的那样,function a(){}实际上是在函数b的内部创建一个局部变量a,如下所示。

var a; 
var b; 

a = 6; 
b = function() { 
var a; 
a = function(){}; 
a = 10; 
console.log(a); //10 
} 
b(); 
console.log(a); //6 
+1

+1提起'提升' – sabithpocker

+0

在'b'里面定义'a'作为一个函数,强制'a'是局部于'b',即使没有明确地执行'var a'。隐式本地范围背后的魔力是什么? – sabithpocker

+0

+1好例子 – John

2

因为你正在创建一个局部变量(函数a),然后用10替换该局部变量的值(function)。

一种避免这种情况的方法是在所有局部变量和函数之前加上“_”(下划线)。

+0

东西告诉我这是不够正确的。我没有downvote,fwiw ... – xandercoded

+2

如果你把'var a = 10;'放在'b'函数的顶部,你将会有一个隐藏全局的局部变量。我相信,函数a()与var a = function()相同(创建一个名为'a'的局部变量,它是一个'function')。 –

+0

表示同意,这里嵌套'函数a'的隐式局部声明是kicker http://jsfiddle.net/AVcqr/ ... – xandercoded

2

This answer对这里发生的事情有很好的解释。

总结是Javascript分两个阶段进行处理,然后编译然后执行。函数定义发生在编译步骤中,因此编译器在b内部看到定义function a() {},并且在b的范围内创建了局部变量a。稍后执行代码时,在执行任何代码之前,b的范围已经包含本地变量a,因此行a = 10;仅给本地变量一个新值。函数定义在编译过程中已经被处理,所以在执行过程中不会发生,所以console.log(a)将输出10

相关问题