当构造函数a被调用时,'a'的值似乎失去了全局范围。JavaScript范围得到改变?为什么会发生?
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
当构造函数a被调用时,'a'的值似乎失去了全局范围。JavaScript范围得到改变?为什么会发生?
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //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
因为你正在创建一个局部变量(函数a
),然后用10
替换该局部变量的值(function
)。
一种避免这种情况的方法是在所有局部变量和函数之前加上“_”(下划线)。
东西告诉我这是不够正确的。我没有downvote,fwiw ... – xandercoded
如果你把'var a = 10;'放在'b'函数的顶部,你将会有一个隐藏全局的局部变量。我相信,函数a()与var a = function()相同(创建一个名为'a'的局部变量,它是一个'function')。 –
表示同意,这里嵌套'函数a'的隐式局部声明是kicker http://jsfiddle.net/AVcqr/ ... – xandercoded
This answer对这里发生的事情有很好的解释。
总结是Javascript分两个阶段进行处理,然后编译然后执行。函数定义发生在编译步骤中,因此编译器在b
内部看到定义function a() {}
,并且在b
的范围内创建了局部变量a
。稍后执行代码时,在执行任何代码之前,b
的范围已经包含本地变量a
,因此行a = 10;
仅给本地变量一个新值。函数定义在编译过程中已经被处理,所以在执行过程中不会发生,所以console.log(a)
将输出10
。
+1提起'提升' – sabithpocker
在'b'里面定义'a'作为一个函数,强制'a'是局部于'b',即使没有明确地执行'var a'。隐式本地范围背后的魔力是什么? – sabithpocker
+1好例子 – John