这些天,公司一直与我们分享javascript的知识,我也把我学习到的分享出来,有写的不对的,请指教,勿喷,^_^。
今天要说的是:javascript函数内所有变量声明提前。在说明结论之前,一般先举个例子以做证明。
example 1:
function example1(){
var x = "hello world";
console.log(x);//line 1
}
example1();
毫无疑问,结果肯定会是输出:hello world
example 2:
function example2(){
console.log(x);//line 1
var x = "hello world";
console.log(x);//line 2
}
example2();
此时,大家猜想一下line 1与line 2处输出结果分别会是什么?我的猜想是,line1
处会抛一个
x is not defined 的错误,程序后面不会执行。因为根据以往的经验,变量在未定义前不能使用。但是运行结果是,line 1:
undefined , line 2 :
hello world. 大家可以肯定的是line 2会输出:
hello world , 但是line 1是怎么回事。
原因是,在javascript中,函数内的所有变量声明会被提前。以下example 3 与 example 2作用是一样的。
example 3:
function example3(){
var x;
console.log(x);//line 1
x = "hello world";
console.log(x);//line 2
}
example3();
由于变量x被提前声明了,所以line 1会输出 undefined, 变量x没有赋值,但是不会报错。line 2是赋值后的结果,所以输出正确结果:hello world
example 4:
var x = "global";
function example4(){
console.log(x);//line 1
var x = "hello world";
console.log(x);//line 2
}
example4();
console.log(x);//line 3
在这里定义了相同名字的全局变量 x , 刚开始我猜想的运行结果结果是,line 1: global , line 2 : hello world ,line 3:hello world,但是运行结果不是这样子的。
运行结果是,line 1: undefined , line 2: hello world,line 3:global
原因是,javascript使用函数管理作用域,变量在函数内声明,如果函数内外有相同变量的声明,最终是依据函数内的变量,且函数内声明的变量只在函数内有效。上面的例子过程是,函数example4被调用的时候,函数内所有变量声明提前,所以函数内变量x声明提前. 函数外部的全局变量x没有被改到,所以结果还是global。
注意:声明提前了,但是赋值动作不会提前。
exmple 5:
function example5(){
for(var i = 0;i < 10;i++);
for(var j = 0;j < 10;j++);
console.log("i:"+i);//line 1
console.log("j:"+j);//line 2
}
example5();
一开始我猜想的结果是line 1与line 2都输出 undefined,但是运行的结果是line 1 与 line 2都输出10.
此处涉及有两个方面,
1):javascript中没有代码块作用域,所以在for循环代码块中声明的变量i与j,它们的作用域是整个example 5函数。
2): 变量声明提前了,相当于在函数刚开始的时候,是先声明变量i 与 j,代码是: var i,j;