美文网首页web前端学员笔记
JS变量提升以及函数提升

JS变量提升以及函数提升

作者: LongFor_ | 来源:发表于2019-06-04 20:48 被阅读53次

在正题开始之前,让我们先来总结一下:
首先,我们需要明白浏览器是如何解析JS代码的,浏览器引擎在读取JS代码的过程中,分为两步。
第一个步骤是整个JS代码的解析读取,第二个步骤是执行。
在读取代码的过程中,就产生了将所有声明提升到顶端,然后再从上往下执行。由此产生了变量提升和函数提升。
1.变量提升只会提升变量名的声明,而不会提升变量的赋值初始化。
2.函数提升的优先级大于变量提升的优先级,通俗点说就是函数提升在变量提升上面。
记住上面的两句话,你就可以非常从容的去撸代码了


来看一些代码,在你的心中默默地猜测一下打印的结果
console.log(fn);
        fn();//可以执行
        var fn = 10;
        fn();//fn已经被赋值为一个变量,无法执行foo为函数
        console.log(fn);
        function fn() {
            var a;
            console.log(a);
            a = 12;
            console.log(a);
        }
        console.log(fn);

怎么样,你的心里是不是有一个结果了。来看一看你对了多少



看完结果,心里是不是有点疑问?让我们看一下它的执行顺序

       function fn() {
            var a;
            console.log(a);
            a = 12;
            console.log(a);
        }
        var fn;
        console.log(fn);
        fn();
        fn = 10;
        fn();//由于这里报错,fn已经被赋值,找不到这个函数,下面的都不会被执行
        console.log(fn);
        console.log(fn);

看完执行顺序,明白为什么会是上面的结果了吗?
再来看几个小例子

        function fn() {
            console.log(x); //输出结果为undefined
        };
        fn()                      
        var x = 5; 

明白为什么输出的结果为undefined吗?还记得上面说的变量提升的概念吗?变量提升只会提升变量名的声明,而不会提升它的赋值,所以当我们去调用fn这个函数时,x确实是提升到了最上面,但它的赋值并没有提升上去,所以我们得到的结果就是undefined。

        function fn() {
            console.log(x); //输出结果为5
        };
        var x = 5;  
        fn()  

为什么把调用和赋值换一下前后顺序就可以打印出一个5呢?这就是我们上面说的先把所有的声明都提升到顶端,然后再从上往下去执行。重点是从上往下,所以我们得到的结果为5

        console.log(f1());//第二个打印 结果为undefined;
        console.log(f2);//第三个打印 结果为undefined;
        function f1() { console.log('hello') }; //第一个打印 结果为hello
        var f2 = function () { };

为什么写在最后一行的代码会在第一个进行打印呢?这是不是就符合我们上面说过的函数提升的原则(函数提升的优先级大于变量提升的优先级),而剩下的两个打印都为undefined又是什么原因造成的呢? 第一个undefined是因为函数没有返回值,所以为undefined,第二个是因为它是一个函数命名式,所以在提升的时候没有把赋值式提升上去,所以它的值也为undefined。

image.png

希望我的理解可以为一些人提供帮助。学识有限,如果那个地方出现错误或不足,感谢指出。

相关文章

  • JS变量提升以及函数提升

    在正题开始之前,让我们先来总结一下:首先,我们需要明白浏览器是如何解析JS代码的,浏览器引擎在读取JS代码的过程中...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • Javascript 变量执行过程 和 数组 & 对象的区别

    变量提升 JS执行过程1. 先提升(先提升函数,再提升变量,如果名字一样,变量提升会覆盖函数提升)2. 再执行,如...

  • 猫眼

    var变量提升,函数声明提升,消除变量声明提升(let); 高阶函数,函数式的编程,柯里化 原型链继承,js面向对...

  • 2021-04-02

    变量提升和函数提升以及他们的优先级 1,变量提升:变量提升是指将变量声明提升到它所在的作用域的最开始部分 2,函数...

  • JavaScript(一)---变量提升及其意义

    js中函数function及变量var的声明都将被提升到函数的最顶部。但是变量的初始化不会提升。 变量提升的原因 ...

  • 深入理解js变量提升和函数提升

    一. 变量提升 这就是变量提升,实际上它的执行顺寻为: 二. 函数提升js中创建函数有两种方式:函数声明式和函数字...

  • js中变量和函数声明的提升

    二 、 js中变量和函数声明的提升

  • JS 变量提升 函数提升

    概念 首先,看这篇文章之前确保你已经理解了js作用域。其次要补充,js在运行的时候,会优先加载当前作用域下的变量。...

  • js变量声明提升与函数表达式

    1.变量声明提升 js引擎会把变量声明与函数声明都提升到当前函数的顶部。eg: js引擎编译为 2.函数表达式 对...

网友评论

    本文标题:JS变量提升以及函数提升

    本文链接:https://www.haomeiwen.com/subject/ldilxctx.html