变量提升
在javascript,变量有4种基本方式进入作用域:
- 语言内置:所有的作用域里都有this和arguments;(译者注:经过测试arguments在全局作用域是不可见的)
- 形式参数:函数的形式参数会作为函数体作用域的一部分;
- 函数声明:像这种形式:function foo(){};
- 变量声明:像这样:var foo;
函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。这个意思是,像下面的代码:
function foo() {
bar();
var x = 1;
}
实际上会被解释成:
function foo() {
var x;
bar();
x = 1;
}
请注意:
变量赋值并没有被提升,只是声明被提升了。但是,函数的声明有点不一样,函数体也会一同被提升。
对于全局作用于范围的变量,var与不var是有区别的. 没有var的写法,其变量不会被提升。比如下面的程序会报错:
<script>
alert(a);
a=1;
</script>
// throw ReferenceError