变量声明
变量的声明需要用到var关键字。
//声明一个名为a的变量
var a;
//因为还没有对a进行初始化(初始化的意思就是第一次赋值),所以其值为undefined
//接下来对a进行初始化
a = 27;
变量的作用域
每一个变量都有一个作用域,也就是程序源代码中定义这个变量的区域。
全局变量拥有全局作用域,即在JavaScript代码的任何地方都是有定义的,又因为有定义所以是可以访问的。
在函数内声明的变量只在函数内以及该函数嵌套的任意函数内有定义,这种变量称为局部变量。形参也算是在函数内定义的。
实例:
var md = 27,year = 2001;//这里声明变量的同时进行了初始化
//可访问md和year
//不可访问a,b,sum,c,d
function add(a,b){
var sum = 0;
//可访问md,year,a,b,sum
//不可访问c,d
sum = a * b;
functon addIn(c,d){
//可访问md,year,a,b,sum,c,d
return sum + c + d;
}
}
变量提升
一般情况下,程序是从上至下按顺序执行。
无论是全局作用域还是函数作用域,变量的声明一定是全作用域的,而赋值是按顺序的。
这就是变量提升,在程序预编译时由编译器完成。
实例:
console.log(a);//undefined
var a = 27;
cosole.log(a);//27
//等价于
var a;
console.log(a);
a = 27;
console.log(a);
JavaScript自动设置全局变量
正常情况下,变量的声明都会用到var关键字
当变量声明了才可以访问
当访问一个没有声明的变量会报错
但是给一个没有声明的变量赋值却不会报错
同样是全局变量,那么用var创建的全局变量和JavaScript自动创建的全局变量有什么区别呢?
首先我们要知道全局变量就是全局对象的一个属性,那么作为对象的属性是有一些特征的,比如是否只读、是否可枚举、是否可配置。用var声明的全局变量是不可配置的,而JavaScript自动创建的全局变量是可以配置的,并且前者不可用delete删除,后者可以。
var重复声明
对于一个变量可以用var重复声明。
var i = 12;
var i = 23;
console.log(i);//23
var i = 12;
var i;
console.log(i);//12,不是undefined
当局部变量和全局变量同名
当局部变量的变量名和全局变量的变量名一样时,那么在可访问区域访问时局部变量的优先级大于全局变量。
函数里面有嵌套函数也一样,从最近的地方开始访问,没有的话再往外找。
var a = 90;
function add(a,b){
var a = 12;
return b + a;
}
console.log(add(33,44));//56
//用var声明的a优先级还大于参数里面的a
var a = 12;
function fun(){
var a = 33;
function funin(){
console.log(a);//33
}
funin();//调用
}
fun();//调用