JavaScript知识点回顾(十五)——变量、作用域与内存(三)

150 阅读2分钟

这是我参与8月更文挑战的第十五天,活动详情查看:8月更文挑战

变量声明

ES6之前,var都是声明变量的唯一关键字。ES6不仅增加了let和const两个关键字,而且还让这两个关键字压倒性地超越了var成为首选。

使用var的函数作用域声明

在使用var声明变量时,变量会自动添加到最接近的上下文。在函数中,最接近的上下文就是函数的局部上下文。在with语句中,最接近的上下文也是函数上下文。如果变量未经声就被初始化,那么它就会自动被添加到全局上下文,如下面的例子所示:

    function add(num1,num2){
        var sum = num1 + num2;
        return sum;
    }
    let result = add(10 , 20);  //30
    console.log(sum);           //报错:sum在这里不是有效变量

这里,函数add()定义了一个局部变量sum,保存加法操作的结果。这个值作为函数的值被返回,但是变量sum在函数外部是访问不到的。如果省略上面例子中的关键字var,那么sum在add()被调用之后就变成可以访问的了,如下所示:

    function add(num1,num2){
        sum = num1 + num2;
        return sum;
    }
    let result = add(10,20); // 30
    console.log(sum);       // 30

这一次,变量sum被用加法操作的结果初始化时并没有使用var声明。在调用add()之后,sum被添加到了全局上下文,在函数退出之后依然存在,从而在后面可以访问到。var声明会被拿到函数或者全局作用域的顶部,位于作用域中所有代码之前。这个现象叫作"变量提升"。提升让同一作用域中的代码不必考虑变量是否已经声明就可以直接使用。可是在实践中,提升也会导致合法却奇怪的现象,即在变量声明之前使用变量。下面的例子展示了在全局作用域中两段等价的代码:

    var name = "juejin";
    //等价于:
    name = 'juejin';
    var name;

下面是两个等价的函数:

    function fn1(){
    var name = 'juejin';
    }
    // 等价于:
    function fn2(){
    var name;
    name = 'juejin';
    }