目录
一、var是JavaScript中定义变量的关键字
使用var声明变量
var message;
message = '你好'
var name = Tom;
声明的变量可以存放任何类型的值。如果没有初始化,变量会保存一个特殊的值:undefined。
二、var声明作用域
《JavaScript高级程序设计(第4版)》中指出:使用var操作符定义的变量会成为包含它的函数的局部变量。比如,使用var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:
funtion test(){ var message = 'hi'; //局部变量 } test(); console.log(message); //出错
- 如果使用var在全局作用域中声明变量,那么该变量为全局变量。且在浏览器环境下,改变量会成为window对象的属性。而在node环境下会挂载到global全局对象上。
- 在函数中使用var声明的变量是包含它函数的局部变量,在函数退出时会被销毁:
funtion test(){
var message = 'hi'; //局部变量
}
test();
console.log(message); //出错
- 在定义变量时省略var关键字,可以创建一个全局变量(但并不推荐这样做,而且在严格模式下会报错):
function test(){
messag = 'hi';全局变量
}
test()
console.log(message) //hi
三、var 声明提升
- 使用var声明的变量会自动提升到函数作用域的顶部,如下面的代码并不会报错:
function foo(){
console.log(age);
var age = 26;
}
foo();//undefined
上面代码在ECMAScript运行时等价于下面代码:
function foo(){
var age;
console.log(age);
age = 26;
}
foo()//undefined
注意:只是声明提升,赋值操作并没有提升
- 多次反复声明一个变量:
function foo(){
var age = 16;
var age = 26;
console.log(age);
var age = 36;
console.log(age);
}
foo(); //26 36
四、例子
- var的作用域
var msg = 'World'
function test(){
var msg = 'Hellow'
console.log(msg);
}
//msg有各自的作用域
test() //Hellow
//函数关闭后函数内的变量销毁
console.log(msg); //World
var msg = 'World'
function test(){
msg = 'hi' //下面有声明,会有声明提升(这里的重新赋值只会影响函数内声明的)
var msg = 'Hellow'
msg = 'Hi,Hi'
console.log(msg);
}
//msg有各自的作用域
test() // Hi,Hi
//函数关闭后函数内的变量销毁
console.log(msg); // World
如果函数内没有var声明,则是全局变量,会影响前面声明的全局变量:
var msg = 'World'
function test(){
msg = 'hi'
console.log(msg);
}
test() //hi
console.log(msg); //hi
- 闭包:由于函数作用域,var声明的变量也可以模拟私有变量。
var msg = '全局'
function test(){
var msg = '局部'
return function(){
console.log(msg);
}
}
const fn = test()
fn() //局部
console.log(msg); //全局
- 构造函数(使用var声明的变量,每个实例也是独立的):
function Foo(){
var count = 0
function fn(){
console.log(count++);
}
return fn
}
const A = new Foo()
const B = new Foo()
A() //0
A() //1
B() //0
五、总结
- 使用var变量声明的变量不一定是全局变量,它也有自己的作用域,var声明的范围是函数作用域。
- var声明的变量有声明提升,但赋值操作不会提升。
- 反复使用var声明同一个变量不会报错。
- 再次说明:var声明的范围是函数作用域;只有在全局声明(不在任何一个函数内)或者省略var关键字声明的变量才是全局作用域的全局变量。
六、参考资料
[美]马特·弗里斯比(Matt Frisbie)著 李松峰 译 ——《JavaScript高级程序设计(第4版)》