1.在函数内声明一个局部变量或者函数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。
2.在全局作用域编写代码可以不写var语句,但声明局部变量时则必须使用var语句。
a=6;
window.onload =function haha(){
b = 9
alert(a);//6
alert(b);//9
}
3.JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。
window.onload = function haha(){
for(var i=0;i<5;i++){
}
alert(i);//5
}
4.有意思的是,这意味着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前(hoisting),即JavaScript函数里声明的所有变量(但不涉及赋值)都被"提前"至函数的顶部
var a = 1;
window.onload = function haha(){
alert(a);//undefined
var a = 0;
alert(a);//0
}
你可能会误以为函数中的第一行会输出1,因为代码还没有执行到var语句声明局部变量的地方。
其实不然,由于函数作用域的特性,局部变量在整个函数体始终是有定义的,也就是说,在函数体内局部变量遮盖了同名全局变量。
尽管如此,只有在程序执行到var语句的时候,局部变量才会被真正赋值。
因此,上述过程等价于:将函数内的变量声明"提前"到函数顶部,同时变量初始化留在原来的位置:
var a = 1;
window.onload = function haha(){
var a ;
alert(a);//undefined
a = 0;
alert(a);//0
}
5.当使用var声明一个变量时候,创建的这个属性是不可配置的,也就是说这个变量无法通过delete运算符删除。如果你没有使用严格模式并给一个未声明的变量赋值的话,JavaScript会自动创建一个全局变量。
window.onload = function test(){
var test1 = 1;//用var声明变量
test2 = 2;//这个变量会被当作是全局变量
alert(delete test1);//false
alert(delete test2);//true
}
JavaScript可以允许使用this关键字来引用全局对象,但没有方法可以引用局部变量中存放的对象。
window.onload = function test(){
var test1 = 1;
this.test1 = 3;//这句话只有在test1为全局变量的时候才有效
alert(test1);//1
}
P72