JavaScript中 var 关键字

目录

一、var是JavaScript中定义变量的关键字

二、var声明作用域

三、var 声明提升

四、例子

五、总结

六、参考资料


一、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版)》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值