【发布时间】:2013-05-24 02:06:32
【问题描述】:
当调用构造函数 a 时,'a' 的值似乎失去了全局作用域。
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
【问题讨论】:
标签: javascript scope hoisting
当调用构造函数 a 时,'a' 的值似乎失去了全局作用域。
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
【问题讨论】:
标签: javascript scope hoisting
由于可变提升,订单解释如下所示。请注意,正如@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 定义为b 中的一个函数,强制a 是b 的本地函数,即使没有明确地执行var a。隐式局部作用域背后的魔力是什么?
function 的默认行为,因为它们在 function 的本地,它们在 ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 中定义
a 是局部范围的表达式。
因为您正在创建一个局部变量(函数a),然后将该局部变量的值(function)替换为10。
避免这种情况的一种方法是在所有局部变量和函数前面加上“_”(下划线)。
【讨论】:
var a = 10;放在b函数的顶部,你将有一个隐藏全局的局部变量。我还相信function a () 的行为与var a = function () 相同(创建一个名为a 的局部变量,即function)。
function a 的隐式本地声明是踢球者jsfiddle.net/AVcqr ...
hoisting 这个词,这对我来说是新的。 :)
This answer 对这里发生的事情有一个非常好的解释。
总结就是Javascript分两个阶段处理,编译和执行。函数定义发生在编译步骤中,因此在b 内部,编译器会看到定义function a() {},并且在b 的范围内创建了局部变量a。稍后在执行代码时,b 的范围在执行任何代码之前已经包含局部变量 a,因此 a = 10; 行只是给局部变量一个新值。函数定义在编译过程中已经处理过了,所以在执行过程中不会发生,所以console.log(a)会输出10。
【讨论】: