一、变量声明
1、遵循原则:先声明,后使用
2、预解析机制(变量提升):对紧跟在关键字(如var,function)后面的变量名称进行声明提前(把声明部分提前,赋值部分保留在原位置)。遇到关键字就有声明提前。
二、变量作用域
1、全局作用域---全局变量:(ES5中)三种声明方式
A.var 变量
B.变量
C.windw.变量(原理:对象.属性)
区别:加var的变量,不能被delete删除,不加var的变量会被delete删除。
Window是作用域链的最顶层
2、函数作用域---局部变量:只有变量在函数内声明时,它才是局部变量
特例:不加var的变量在函数内声明,则是全局变量
3.作用域链的最顶层是window
4.变量的定义没有块级作用域(如:if,while等块中,即非函数的块),故里面声明的变量还是全局变量
三、未定义的变量和为赋值的变量
1、变量未定义,且未赋值---------报错
2、变量定义,但是未赋值---------undefinde
3、变量未定义,但是有赋值---------正常显示,程序会在全局中隐式声明该变量
关于变量的练习:
1题、
if(!(ain window)){
var a=1;
//a=1;//vara被提前后
}
console.log(a)
解析:
1、 变量提升
2、 console.log(变量x in window);变量x必须是干干净净的,不能有赋值,最后输出true;否则输出false。
程序解析为:
var a;//因为a没有被赋值,所以a in window为true
if(!(ain window)){//false
var a=1;
}
console.log(a)//undefinde
2题、
var x=1;
y=2;
function fn1(){
deletex;
deletey;//delete只会删除未加var的变量,不会删除加了var的变量和参数
console.log(x);//1
console.log(y);//报错
}
fn1();
解析:delete只会删除未加var的变量,不会删除加了var的变量和参数;
因为y没有直接定义,所以他是全局作用域的一个属性,是可配置的,所以可以删除;x是有var声明的,所以他是不可配置的,所以不可删除;
3题
(function(x){
deletex;//delete对局部变量名不起作用
console.log(x);//5
})(1+4);
解析:delete对局部变量名不起作用
4题、
var a=1;
function fn(){
console.log(a);//1
a=2;//没有加 var,就是全局变量,加var后,则是局部变量
console.log(a);//2
}
fn();
console.log(a);//2