设为首页 加入收藏

TOP

JavaScript变量提升的本质
2018-03-28 09:05:55 】 浏览:96
Tags:JavaScript 变量 提升 本质

先说三句总结性的话:


所以,我们要注意,这三种变量提升,含义是不同的。


在进入一个执行上下文后,先把 var 和 function 声明的变量前置,再去顺序执行代码。


PS:作用域分为全局作用域和函数作用域,用var声明的变量,只在自己所在的所用域有效。


我们举例来看看下面的代码。


代码 1:


    console.log(fn);
    var fn = 1;


    functionfn() {
    }


    console.log(fn);


相当于:


    var fn = undefined;


    functionfn() {
    }


    console.log(fn);
    fn = 1;
    console.log(fn);


打印结果:



代码 2:


    console.log(i);
    for (var i = 0; i < 3; i++) {
        console.log(i)
    }


相当于:


    var i = undefined;


    console.log(i);
    for (i = 0; i < 3; i++) {
        console.log(i);
    }


打印结果:



代码 3:


    var a = 1;


    functionfn() {
        a = 2;
        console.log(a)
        var a = 3;
        console.log(a)
    }


    fn();
    console.log(a);


相当于:


    var a = undefined;


    functionfn() {
        var a


        a = 2
        console.log(a)
        a = 3
        console.log(a)
    };


    a = 1;
    fn();
    console.log(a);


打印结果:



假设a被声明为变量,紧接着a又被声明为函数,原则是:声明会被覆盖(先来后到,就近原则)。


PS:


举例1:


    var fn;  //fn被声明为变量
    functionfn() {// fn被声明为function,就近原则


    }


    console.log(fn); //打印结果:function fn(){}


举例2:


    functionfn() {}  //fn被声明为function,且此时fn已经被赋值,这个值就是function的对象


    var fn;  //fn已经在上一行被声明且已经有值, 再 var 无效,并不会重置为 undefined


    console.log(fn)  //打印结果:function fn(){}既然再var无效,但是再function,是有效的:


    functionfn() {}  //fn被声明为function,且此时fn已经有值,这个值就是function的对象


    functionfn() {  //此时fn被重复赋值,会覆盖上一行的值
        console.log('smyhvae');
    }
    console.log(fn)


打印结果:



提醒1:


在函数作用域也有声明提前的特性:


因此,在函数中,没有var声明的变量都会成为全局变量,而且并不会提前声明。


举例1:


        var a = 1;


        functionfoo() {
            console.log(a);
            a = 2;    // 此处的a相当于window.a
        }


        foo();
        console.log(a);  //打印结果是2


上方代码中,foo()的打印结果是1。如果去掉第一行代码,打印结果是Uncaught ReferenceError: a is not defined


提醒2:定义形参就相当于在函数作用域中声明了变量。


        function fun6(e) {
            console.log(e);
        }


        fun6();  //打印结果为 undefined
        fun6(123);//打印结果为123


    var a = 1;
    if (a > 0) {
        console.log(a);
        var a = 2;
    }
    console.log(a);


打印结果:


1


2


上方代码中,不存在块级作用域的概念。if语句中用var定义的变量,仍然是全局变量。


顺便延伸一下,用let定义的变量,是在块级作用域内有效。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇shell脚本之test测试命令 下一篇从JavaScript的事件循环到Promise

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目